【问题标题】:How do i write a Regular Expression to match text containing XYZ but not ABC?如何编写正则表达式来匹配包含 XYZ 但不包含 ABC 的文本?
【发布时间】:2009-01-15 18:43:00
【问题描述】:

如果字符串包含 XYZ 但不包含 ABC,我想编写一个匹配的正则表达式。所以“blah XYZ blah”应该匹配,但“blah ABC blah XYZ blah”不应该匹配。

有什么想法吗?特别是我正在用 c# 编写正则表达式,以防该语法有任何特定的内容。

我想我可以使用负面的lookbehind,但之前没有使用过......

谢谢!

更新:我需要一个正则表达式,因为我无法修改代码,只是一些配置。

更新:更改,因为我实际上只需要检查 ABC 没有出现在之前 XYZ,我不需要检查它是否出现在之后。

【问题讨论】:

    标签: c# regex


    【解决方案1】:
    ^(?:(?<!ABC).)*XYZ
    

    对我的小测试集来说很好。

    【讨论】:

    • “ABCXYZ”也会被匹配。
    • 注意:我最终使用了“(?si)^(?:(?
    • 其实,Alan M 没有后视的回答可能更快。
    • @Rory:如果一个看起来更好,请不要犹豫更改已接受的答案! :-) 我承认我不知道一个是否更快。这可能并不重要,除非您有兆字节的数据要检查。
    【解决方案2】:

    无需往后看:

    ^(?:(?!ABC).)*XYZ
    

    【讨论】:

      【解决方案3】:

      有什么问题

       string.Contains("XYZ") && !string.contains("ABC") 
      

      【讨论】:

      • 两个子字符串都可以在字符串中,只是没有一定的顺序。
      • 虽然 OP 处于需要正则表达式的不幸情况:(
      【解决方案4】:

      这应该可以解决问题:

      ^([^(ABC)]*)(XYZ)(.*)$
      

      一些例子:

      sadsafjaspodsa //False
      sadABCdsaABCdsa //False
      sadABCdsaABCdsaXYZ //False
      sadABCdsaABCdsaXYZaa //False
      sadABCddasABCsaXYZdsa //False
      sadsaXYZdsa //True
      sadsaXYZ //True
      

      【讨论】:

      • @PhiLho:你的案子应该是假的。
      • @J.J.:PhiLho 是对的,如果 ABC 中的任何给定字符出现在 XYZ 之前,我的表达就会失败
      • 括号也是:sad()dsaXYZasd // False
      【解决方案5】:

      这应该可行:

      ^(?:(?!ABC).{3,})?XYZ
      

      如果它也不应该出现在XYZ之后:

      ^(?:(?!ABC).{3,})?XYZ(?:.{3,}(?<!ABC))?$
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多