Regex 正则表达式前缀仅在look-behind断言中匹配

Regex 正则表达式前缀仅在look-behind断言中匹配,regex,Regex,我试图编写一个正则表达式来解析这样一段(看起来很简单)文本 some stuff First name: John Last name: Smith more stuff 我想捕获名字和姓氏,所以我尝试了这样的正则表达式: (?<=First name:\s*)(?<FirstName>\w+)(?<=\s*Last name:\s*)(?<LastName>\w+) (?刚刚意识到我可能不需要回头看,因为以下方法有效: First name:\s*(?&

我试图编写一个正则表达式来解析这样一段(看起来很简单)文本

some stuff
First name: John
Last name: Smith
more stuff
我想捕获名字和姓氏,所以我尝试了这样的正则表达式:

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

(?刚刚意识到我可能不需要回头看,因为以下方法有效:

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

尽管如此,我还是很想知道为什么它不能与look behind一起工作,以备将来参考。

我认为您需要确保换行符在您使用的任何正则表达式语言中都是可匹配的


在Python中,这意味着将
re.DOTALL
传递给
re.compile()
或您正在使用的任何
re
函数。在Perl中,在最后一个斜杠后添加
s

因为后视断言的宽度为零(即,它们不使用任何字符),所以FirstName捕获将匹配/捕获“FirstName:,在本例中为“John”。在第一次匹配之后,目标字符串中的位置将紧跟在“John”之后。但由于正则表达式的下一部分是后面的另一部分,正则表达式将查看其当前位置之前的内容是否与后面的文本匹配,在本例中为“Last name:”。因为它实际上前面有“John”,整个正则表达式都失败了,甚至连“Smith”都没找到。

我知道这个答案很古老,但DOTALL/singleline模式不会有任何效果。它所做的只是改变点的含义,这个正则表达式中没有点。
John(?<=\s*Last name:\s*)(?<LastName>\w+)
First name:\s*(?<FirstName>\w+)\s*Last name:\s*(?<LastName>\w+)