【问题标题】:How do I properly match Regular Expressions?如何正确匹配正则表达式?
【发布时间】:2010-10-03 14:27:45
【问题描述】:

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

【问题讨论】:

  • 您使用哪种语言?
  • 我会看看这个优秀的在线正则表达式教程:regular-expressions.info。我就是这么学的。
  • 哈利波特+1,哈哈
  • 老实说,我不会在这里使用正则表达式。你有一个简单的逗号分隔格式的数据——利用它!使用您喜欢的语言拆分功能以逗号拆分,然后以 = 拆分,然后您无需正则表达式即可获得键和值。
  • @Robert P:我同意。正则表达式很棒,但如果可以的话,请使用更简单的工具。此外,@eleven81,您可能希望将您的问题重命名为更适合有类似问题的人的索引。即“如何正确匹配正则表达式?”

标签: regex sed pattern-matching


【解决方案1】:

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

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

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

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

对于正则表达式的优秀资源,我建议:Mastering Regular Expressions

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 将您的 sed 命令放入 backquotes 中,这样它就不会将您的星号更改为 Markdown 格式。 :-)
    • 感谢您的提示!我在发布此答案后不久就知道了这一点,但再也没有回来解决这个问题。
    【解决方案3】:

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

    【讨论】:

    • +1,很棒的免费工具,极大地帮助调试这些称为正则表达式的老鼠窝。
    • 或许是因为它不是问题的直接答案。虽然它是一个非常有用的工具。
    【解决方案4】:

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

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

    那么你会想要得到第一个子匹配。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        这将匹配

        HPOTTER
        HGRANGER
        RWEASLEY
        DMALFOY
        SSNAPE
        ADUMBLED
        

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

        【讨论】:

        • sed 确实支持向后看,但是您需要使用 Perl 模式开关 (-R)
        【解决方案7】:

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

        【讨论】:

        • 哇。语法对于这个来说太过分了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        • 2021-10-06
        • 2012-12-22
        • 1970-01-01
        相关资源
        最近更新 更多