【问题标题】:Regex pattern UNMATCH in VB.NET or C#VB.NET 或 C# 中的正则表达式模式 UNMATCH
【发布时间】:2011-03-07 22:13:27
【问题描述】:

需要一个模式来匹配一个不应该是的字符串 --

777777777
888888888
999999999

或以00 或02 或04 开头。

当我尝试创建一个模式来满足上述要求时,我完成了 -

Dim _pattern6 As String = "^(7+|8+|9+|(00|07|08|09|17|18|19|28|29|43|48|69|70|78|79|80|96|97).*)$"

无法完成 NOT MATCH 部分。

【问题讨论】:

    标签: c# regex vb.net


    【解决方案1】:

    你想要的是negative lookahead。

    @"^(?!([789])\1{8}$|0[024]).*$"
    

    负前瞻(?!...) 表示“此位置之后的任何内容都无法匹配任何这些模式。”所以(?!7{9}).* 表示“任何不以连续九个7s 开头的字符串(.*)。” ([789])\1{8}$ 是 9 个重复数字的简写。它的意思是“7、8 或 9 中的任意一个,然后再 8 次。”

    在 RegexPlanet 上测试:http://fiddle.re/tz8p

    【讨论】:

    • 我从未尝试在正则表达式的末尾添加两个 $ ,它有效吗? (尽管我想您第一次看时并没有匹配它)。所以,+1 先生。
    • @jb - 正确:第一个$ 只是说后面的内容将不是相同数字的 9 [7-9] 和行尾。 $ 在正则表达式中的任何地方都有效,只要结果仍然有意义,所以 (^foo$|^bar$|^baz$) 可以正常工作,而 foo$bar$ 不会。感谢您的+1。 :)
    【解决方案2】:

    您可以尝试匹配不需要的部分。如果返回 true,您就知道“不匹配”的尝试将是 false,反之亦然。

    【讨论】:

      【解决方案3】:

      给你

      [^(7{9}|8{9}|9{9}|00|02|04)]+
      

      【讨论】:

      • 这不是否定字符类的工作方式。如果您没有收到运行时错误,我很确定这将在组中查找特殊字符的文字版本。
      • 这简化为[^024789]+ 即“除这些数字之外的任何东西”
      • @贾斯汀说得对; [^(7{9}|8{9}|9{9}|00|02|04)] 等价于 [^024789(){}|],它匹配任何 one 字符,只要它不是列表中的字符之一。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多