正则表达式跨行多行

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)

你能告诉我我做错了吗?

ste*_*ema 5

我会这样:

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