如何正确匹配正则表达式?

时间:2009-01-26 17:56:27

标签: regex sed pattern-matching

我有一个从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 个答案:

答案 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语法会立即对此进行排序。