我有一个从ldapsearch
输出的对象列表,如下所示:
dn: cn=HPOTTER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=HGRANGER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=RWEASLEY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=DMALFOY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=SSNAPE,ou=FACULTY,ou=HOGWARTS,o=SCHOOL
dn: cn=ADUMBLED,ou=FACULTY,ou=HOGWARTS,o=SCHOOL
到目前为止,我有以下正则表达式:
/\bcn=\w*,/g
它返回如下结果:
cn=HPOTTER,
cn=HGRANGER,
cn=RWEASLEY,
cn=DMALFOY,
cn=SSNAPE,
cn=ADUMBLED,
我需要一个返回如下结果的正则表达式:
HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED
我需要在正则表达式中做什么修改,这样模式(cn=
和逗号)就不会包含在结果中了?
**编辑:**我将使用sed
进行模式匹配,并将输出通过管道传输到其他命令行实用程序。
7条答案
按热度按时间azpvetkf1#
看看Expresso,我过去用它来构建我的RegEx。帮助学习也很好。
q9rjltbz2#
快速和肮脏的方法是使用submatches,假设你的引擎支持它:
然后你会想要得到第一个子匹配。
n3h0vuf23#
在不知道您使用的是哪种语言的情况下,我们无法确定,但是在大多数正则表达式解析器中,如果您使用括号,例如
/\bcn=(\w*),/g
然后你就可以得到第一个匹配的模式(通常是\1),就像你正在搜索的那样。更具体地说,我们需要知道您使用的是哪种语言。
fzsnzjdm4#
如果你的正则表达式支持Lookaheads和Lookbehind,那么你可以使用
将匹配
但两边的
cn=
和,
都没有。逗号和cn=
仍然必须在匹配中存在,只是不包括在结果中。ct2axkht5#
听起来更像是一个简单的解析问题,而不是正则表达式。ANTLR语法可以很快解决这个问题。
j2cgzkjk6#
你将不得不进行分组。这是通过修改正则表达式来完成的:
这将把结果填充到一个分组变量中。根据您的语言,如何提取此值将有所不同。(对于使用 sed 的用户,变量将为\1)
请注意,大多数正则表达式的风格,你不必转义括号(),但因为你使用 sed,你将需要如上所示。
对于正则表达式的优秀资源,我建议:Mastering Regular Expressions
0ve6wy6x7#
好吧,你问更具体问题的地方被关闭了,因为它是这个问题的“精确副本”,所以我把我的答案从那里复制到这里:
如果你想使用sed,你可以使用如下方法:
sed -e 's/dn: cn=\([^,]*\),.*$/\1/'
你必须使用
[^,]*
,因为在sed中,.*
是“贪婪的”,这意味着它会在查看任何后续字符之前匹配所有可能的字符。这意味着如果你在模式中使用\(.*\),
,它将匹配到最后一个逗号,而不是第一个逗号。