【问题标题】:Regular expression. Begins with and not equal to正则表达式。以不等于开头
【发布时间】:2010-06-22 19:33:12
【问题描述】:

我有一个字符串需要验证。

前两个字符必须由 A-G 或 Z 组成,但不能为以下组合:GB 或 ZZ。

如何在正则表达式中表达?

【问题讨论】:

  • 你使用的是哪个正则表达式库?

标签: c# .net regex regex-negation


【解决方案1】:

负后视最适合这个。

[A-GZ]{2}(?<!GB)(?<!ZZ)

解释:

[A-GZ]{2} 恰好匹配两个字符,这两个字符都必须是 A-G 或 Z。
(?&lt;!GB) 仅在前两个匹配的字符不是 GB 时匹配。
(?&lt;!ZZ) 仅在前两个匹配时匹配匹配的字符不是 ZZ。

与所有前瞻和后瞻操作一样,负向后视是零宽度,这意味着它不会改变光标位置。这就是为什么你可以像我一样将两个连续串在一起。我比 | 更喜欢这个,因为它清楚地表明了不允许的两种情况。并且执行两次应该具有与 | 相同的运行时效果。操作员在单个后视中。

【讨论】:

  • 这也是正则表达式风格的罕见功能之一(例如,在 JavaScript 中不起作用)。负前瞻得到更广泛的支持并且同样简单:^(?!GB)(?!ZZ)[A-GZ]{2}——还添加了^,因为他指定了“前两个字符”
  • 如果前两个字符必须分开计算怎么办? [A-GZ]{1}[A-GXZ]{1}(?
【解决方案2】:
^([A-F][A-GZ]|G[AC-GZ]|Z[A-G]).*

【讨论】:

  • 与许多正则表达式风格最兼容...在开头添加 ^ 以获得验证的“前两个字符”部分...
  • @gnarf 最后的.* 暗示这是一个全文匹配
  • @Michael Mrozek - 抱歉,但^$ 从未在我使用的任何正则表达式语言中隐含...上述模式可以匹配ZZ AA aasdfasd 它只会匹配AA aasdfasd
  • @gnarf 大多数正则表达式库(至少我见过)有两种匹配方法,部分匹配和完全匹配。完全匹配要求模式完全描述输入字符串,它不能匹配子字符串。如果这是部分匹配,则无需在末尾包含.*,因此他打算在这里进行完整匹配似乎是合乎逻辑的
  • 使用matches()方法时Java正则在两端锚定,使用match()方法时Python正则锚定在开头,XML Schema正则始终锚定在两端.这些是我知道的唯一隐式锚定的例子,所以我认为假设读者熟悉这个概念是不安全的。如果您提供需要锚定的正则表达式,则应使用显式锚点,或者在这种情况下解释为什么不需要它们。
【解决方案3】:

^([A-F][A-GZ]|G[AC-GZ]|Z[A-G])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2013-06-10
    • 2017-01-26
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多