我有一个从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
进行模式匹配,并将输出传递给其他命令行实用程序。
答案 0 :(得分:13)
您必须执行分组。这是通过将正则表达式修改为:
来完成的/\bcn=\(\w*\),/g
然后,这会将结果填充到分组变量中。根据您的语言,如何提取此值将有所不同。 (对于 sed ,变量将为\ 1)
请注意,大多数正则表达式都不必转义括号(),但由于您使用 sed ,因此需要如上所示。
对于正则表达式的优秀资源,我建议:Mastering Regular Expressions
答案 1 :(得分:4)
好的,您提出更具体问题的地方被关闭为“完全重复”,所以我将答案从那里复制到此处:
如果您想使用sed,可以使用以下内容:
sed -e 's/dn: cn=\([^,]*\),.*$/\1/'
你必须使用[^,]*
,因为在sed中,.*
是“贪婪的”,这意味着在查看任何后续字符之前它会匹配所有内容。这意味着如果您在模式中使用\(.*\),
,它将匹配最后一个逗号,而不是第一个逗号。
答案 2 :(得分:2)
查看Expresso我过去曾使用它来构建我的RegEx。帮助学习也很好。
答案 3 :(得分:2)
快速而肮脏的方法是使用子匹配,假设您的引擎支持它:
/\bcn=(\w*),/g
然后你想得到第一个子匹配。
答案 4 :(得分:2)
在不知道您使用的语言的情况下,我们无法确定,但在大多数正则表达式解析器中,如果使用括号,例如
/ \ BCN =(\ W *),/克
然后您将能够获得第一个匹配模式(通常为\ 1),就像您正在搜索的那样。更具体地说,我们需要知道您正在使用的语言。
答案 5 :(得分:2)
如果您的正则表达式支持Lookaheads和Lookbehinds,那么您可以使用
/(?<=\bcn=)\w*(?=,)/g
那将匹配
HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED
但不是任何一方的cn=
或,
。逗号和cn=
仍然必须在那里进行匹配,它只是不包含在结果中。
答案 6 :(得分:-1)
听起来更像是一个简单的解析问题,而不是正则表达式。 ANTLR语法会立即对此进行排序。