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

vh0rcniy  于 2023-10-22  发布在  其他
关注(0)|答案(7)|浏览(113)

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

azpvetkf

azpvetkf1#

看看Expresso,我过去用它来构建我的RegEx。帮助学习也很好。

q9rjltbz

q9rjltbz2#

快速和肮脏的方法是使用submatches,假设你的引擎支持它:

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

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

n3h0vuf2

n3h0vuf23#

在不知道您使用的是哪种语言的情况下,我们无法确定,但是在大多数正则表达式解析器中,如果您使用括号,例如
/\bcn=(\w*),/g
然后你就可以得到第一个匹配的模式(通常是\1),就像你正在搜索的那样。更具体地说,我们需要知道您使用的是哪种语言。

fzsnzjdm

fzsnzjdm4#

如果你的正则表达式支持Lookaheads和Lookbehind,那么你可以使用

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

将匹配

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

但两边的cn=,都没有。逗号和cn=仍然必须在匹配中存在,只是不包括在结果中。

ct2axkht

ct2axkht5#

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

j2cgzkjk

j2cgzkjk6#

你将不得不进行分组。这是通过修改正则表达式来完成的:

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

这将把结果填充到一个分组变量中。根据您的语言,如何提取此值将有所不同。(对于使用 sed 的用户,变量将为\1)
请注意,大多数正则表达式的风格,你不必转义括号(),但因为你使用 sed,你将需要如上所示。
对于正则表达式的优秀资源,我建议:Mastering Regular Expressions

0ve6wy6x

0ve6wy6x7#

好吧,你问更具体问题的地方被关闭了,因为它是这个问题的“精确副本”,所以我把我的答案从那里复制到这里:
如果你想使用sed,你可以使用如下方法:
sed -e 's/dn: cn=\([^,]*\),.*$/\1/'
你必须使用[^,]*,因为在sed中,.*是“贪婪的”,这意味着它会在查看任何后续字符之前匹配所有可能的字符。这意味着如果你在模式中使用\(.*\),,它将匹配到最后一个逗号,而不是第一个逗号。

相关问题