8

我有一个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模式匹配,并将输出通过管道传输到其他命令行实用程序。

4

7 回答 7

13

您将必须执行分组。这是通过将正则表达式修改为:

/\bcn=\(\w*\),/g

然后,这会将您的结果填充到分组变量中。根据您的语言,如何提取此值会有所不同。(对于您使用sed的变量将是 \1)

请注意,大多数正则表达式风格您不必转义括号 (),但由于您使用的是sed,因此您需要如上所示。

对于正则表达式的优秀资源,我建议:掌握正则表达式

于 2009-01-26T18:00:23.200 回答
4

好的,您提出更具体问题的地方已被关闭为“完全重复”,所以我将我的答案从那里复制到这里:

如果你想使用 sed,你可以使用类似下面的东西:

sed -e 's/dn: cn=\([^,]*\),.*$/\1/'

您必须使用[^,]*,因为在 sed 中,.*它是“贪婪的”,这意味着它会在查看任何后续字符之前匹配所有可能的内容。这意味着如果您\(.*\),在模式中使用它,它将匹配最后一个逗号,而不是第一个逗号。

于 2009-01-26T18:41:13.320 回答
2

查看Expresso我过去曾使用它来构建我的 RegEx。帮助学习也不错。

于 2009-01-26T18:00:23.233 回答
2

假设您的引擎支持它,快速而肮脏的方法是使用子匹配:

/\bcn=(\w*),/g

然后你会想要得到第一个子匹配。

于 2009-01-26T18:01:10.343 回答
2

在不知道您使用的是什么语言的情况下,我们无法确定,但在大多数正则表达式解析器中,如果您使用括号,例如

/\bcn=(\w*),/g

那么您将能够获得与您正在搜索的内容完全相同的第一个匹配模式(通常为 \1)。更具体地说,我们需要知道您使用的是什么语言。

于 2009-01-26T18:01:40.563 回答
2

如果您的正则表达式支持 Lookaheads 和 Lookbehinds 那么您可以使用

/(?<=\bcn=)\w*(?=,)/g

那将匹配

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

但不是cn=两边,的。逗号cn=仍然必须在匹配中出现,只是不包含在结果中。

于 2009-01-26T18:52:07.433 回答
-1

听起来更像是一个简单的解析问题,而不是正则表达式。ANTLR 语法会很快解决这个问题。

于 2009-01-26T17:59:47.523 回答