代码之家  ›  专栏  ›  技术社区  ›  eleven81

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

  •  8
  • eleven81  · 技术社区  · 16 年前

    我有一个从中输出的对象列表 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 回复  |  直到 16 年前
        1
  •  13
  •   Gavin Miller    16 年前

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

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

    然后将结果填充到分组变量中。根据您的语言,如何提取此值将有所不同。(为您准备 变量将为\1)

    请注意,大多数regex风格不必转义括号(),但因为您正在使用 您将需要按照上面所示进行操作。

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

        2
  •  4
  •   Eddie    16 年前

    好的,你问更具体问题的地方被封为“完全重复”,所以我把我的答案从那里复制到这里:

    如果您想使用sed,可以使用如下内容:

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

    你必须使用 [^,]* 因为在sed中, .* 是“贪婪”的意思是,在看下面的任何角色之前,它会匹配所有它能匹配的东西。这意味着如果你使用 \(.*\), 在您的模式中,它将匹配到最后一个逗号,而不是第一个逗号。

        3
  •  2
  •   Brawndo    16 年前

    退房 Expresso 我过去用它来构建我的正则表达式。帮助学习也很好。

        4
  •  2
  •   EBGreen    16 年前

    快速和肮脏的方法是使用子匹配,假设您的发动机支持它:

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

    那么你会想要第一次的比赛。

        5
  •  2
  •   Eddie    16 年前

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

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

        6
  •  2
  •   Grant    16 年前

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

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

    那会匹配的

    HPOTTER
    HGRANGER
    RWEASLEY
    DMALFOY
    SSNAPE
    ADUMBLED
    

    但不是 cn= 或者 , 我们仍然必须参加比赛,只是结果中没有包括这一点。

        7
  •  -1
  •   duffymo    16 年前

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