n1t*_*1te 4 regex parsing lookahead
在过去的几个小时中,我一直在尝试从以下示例数据中匹配地址,但无法正常工作:
medicalHistory None
address 24 Lewin Street, KUBURA,
NSW, Australia
email MaryBeor@spambob.com
address 16 Yarra Street,
LAWRENCE, VIC, Australia
name Mary Beor
medicalHistory None
phone 00000000000000000000353336907
birthday 26-11-1972
Run Code Online (Sandbox Code Playgroud)
我的计划是查找以“ address”开头,后跟任何空格,后跟字符,数字逗号和换行符,以换行符结尾,后跟字符的任何内容。我提出了以下内容(及其许多变体):
address\s+([0-9a-zA-Z, \n\t]+)(?!\n\w)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它符合以下条件:
address 24 Lewin Street, KUBURA,
NSW, Australia
email MaryBeor
Run Code Online (Sandbox Code Playgroud)
和
address 16 Yarra Street,
LAWRENCE, VIC, Australia
name Mary Beor
medicalHistory None
phone 00000000000000000000353336907
birthday 26
Run Code Online (Sandbox Code Playgroud)
代替
address 24 Lewin Street, KUBURA,
NSW, Australia
Run Code Online (Sandbox Code Playgroud)
和
address 16 Yarra Street,
LAWRENCE, VIC, Australia
Run Code Online (Sandbox Code Playgroud)
你能告诉我我做错了吗?
我会这样:
address\s+((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+
Run Code Online (Sandbox Code Playgroud)
在Regexr上看到它。
这((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+是重要的部分,我说的是[0-9a-zA-Z, \r\n\t],如果(?![\r\n]+\w)没有跟随,请匹配中的下一个字符。这符合您的期望。
在这两种情况下,正则表达式都因为字符类中未包含的字符而停止匹配。如果您想采用这种方式,则需要结合使用惰性量词和正向前瞻:
address\s+([0-9a-zA-Z, \n\r\t]+?)(?=\r\w)
Run Code Online (Sandbox Code Playgroud)
[0-9a-zA-Z, \n\r\t]+?在条件(?=\r\w)为真之前尽可能少地匹配。
看到这里Regexr