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

regex前缀仅在look-behind断言中匹配

  •  0
  • EMP  · 技术社区  · 15 年前

    我正试图编写一个regex来解析这样一段(看起来非常简单)的文本。

    some stuff
    First name: John
    Last name: Smith
    more stuff
    

    我想截取名字和姓氏,所以我尝试了这样的正则表达式:

    (?<=First name:\s*)(?<FirstName>\w+)(?<=\s*Last name:\s*)(?<LastName>\w+)
    

    找不到匹配项。每个部分(名字和姓氏)单独工作,但它们不一起工作。此外,以下工作

    (?<=John\s*Last name:\s*)(?<LastName>\w+)
    

    但是当我把“约翰”从不匹配的组中移出时…

    John(?<=\s*Last name:\s*)(?<LastName>\w+)
    

    …不匹配!

    我在这里做错什么了?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Bryan    15 年前

    由于look-behind断言的宽度为零(即它们不使用任何字符),因此first name捕获将匹配/捕获“first name:”之后的内容,在本例中为“john”。在第一次匹配之后,目标字符串中的位置将紧接在“john”之后。但是,由于regex的下一部分是另一个look-behind,regex将查看其当前位置前面的内容是否与您的look-behind文本匹配,在本例中是“姓氏:”。因为它的前面实际上是“john”,所以整个regex都失败了,甚至连“smith”都找不到。

        2
  •  0
  •   EMP    15 年前

    我刚刚意识到我可能不需要看后面,因为下面的工作是有效的:

    First name:\s*(?<FirstName>\w+)\s*Last name:\s*(?<LastName>\w+)
    

    尽管如此,我还是有兴趣知道为什么它不适用于后面的参考。

        3
  •  0
  •   a paid nerd    15 年前

    我认为你需要确保新行在你使用的任何regex语言中都是匹配的。

    在python中,这意味着传递 re.DOTALL re.compile() 或者什么 re 你使用的功能。在Perl,添加 s 在最后一个斜线之后。