【问题标题】:How to restrict the negative lookahead in regex如何限制正则表达式中的负前瞻
【发布时间】:2018-10-10 12:17:41
【问题描述】:

我有一个字符串:

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)),以确保没有像动物、宠物、医院这样的关键字出现在第一组和第二组之间。

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

【问题讨论】:

    标签: java regex regex-lookarounds


    【解决方案1】:

    (?:(?![\s\S]*?(?:(?i)veterinary|animal|hospital|care |pets?|clinic))[\s\S]*?) 模式相当麻烦,但您似乎想匹配最左边出现的任何文本 veterinaryanimalhospitalcarepetpetsclinic

    你需要修复正则表达式的那部分

    (?:(?!veterinary|animal|hospital|care\ |pets?|clinic)[\s\S])*?
    

    regex demo

    该模式将匹配任何字符 ([\s\S]),并尽可能少 (*?) 不匹配 (?!veterinary|animal|hospital|care\ |pets?|clinic) 否定前瞻中的字符序列。

    我还建议格式化模式字符串(如在我的演示中)并使用 Pattern.COMMENTS 修饰符选项(然后不要忘记转义任何文字空格和 # 字符)。

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2011-10-14
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多