如何限制正则表达式中的负面前瞻

时间:2018-10-10 12:17:42

标签: java regex regex-lookarounds

我有一个字符串:

Symphony Veterinary Center                                                           

symphony care veterinary  

170 cort 96th St.,                                                                   
naib, NZ 10025                                                            
212-866-8000                                                                                                                                              

                We care yours like ours !!                                                                                                                  

我正在尝试this regex

((?i)^(?=.*?(?:veterinary|animal[^s]|hospital| care |pets?|clinic)) *(?:[^ \n\r:]+? +?){1,5}$)(?:(?![\s\S]*?(?:(?i)veterinary|animal|hospital|care |pets?|clinic))[\s\S]*?)(\d{2,}[\s\S]+?(?: [A-Z][A-Za-z] (?:\d+-)?\d+))

根据正则表达式,第一组应捕获医院名称,第二组应仅捕获地址。

在此正则表达式中,第一组和第二组之间的前瞻性(?![\s\S]*?(?:(?i)veterinary|animal|hospital|care |pets?|clinic))否定,以确保第一和第二组之间没有动物,宠物,医院等关键字出现。 / p>

但是仅当我删除字符串的最后一行中的care时,它才匹配。我不知道为什么负前瞻会一直检查到字符串末尾而不是第二组之前?

1 个答案:

答案 0 :(得分:1)

Expandable List模式非常麻烦,但是您似乎想匹配任何文本,直到最左边出现的(?:(?![\s\S]*?(?:(?i)veterinary|animal|hospital|care |pets?|clinic))[\s\S]*?)veterinaryanimal,{{1 }},hospitalcarepet

您需要修复正则表达式的一部分,例如

pets

请参见regex demo

该模式将匹配任何不会以clinic负向超前开始字符序列的字符((?:(?!veterinary|animal|hospital|care\ |pets?|clinic)[\s\S])*? ),并尽可能少地匹配([\s\S])。

我还建议格式化模式字符串(如我的演示中所示),并使用*?修饰符选项(不要忘了转义任何文字空白和(?!veterinary|animal|hospital|care\ |pets?|clinic)字符)。