【发布时间】:2010-06-22 19:33:12
【问题描述】:
我有一个字符串需要验证。
前两个字符必须由 A-G 或 Z 组成,但不能为以下组合:GB 或 ZZ。
如何在正则表达式中表达?
【问题讨论】:
-
你使用的是哪个正则表达式库?
标签: c# .net regex regex-negation
我有一个字符串需要验证。
前两个字符必须由 A-G 或 Z 组成,但不能为以下组合:GB 或 ZZ。
如何在正则表达式中表达?
【问题讨论】:
标签: c# .net regex regex-negation
负后视最适合这个。
[A-GZ]{2}(?<!GB)(?<!ZZ)
解释:
[A-GZ]{2} 恰好匹配两个字符,这两个字符都必须是 A-G 或 Z。(?<!GB) 仅在前两个匹配的字符不是 GB 时匹配。(?<!ZZ) 仅在前两个匹配时匹配匹配的字符不是 ZZ。
与所有前瞻和后瞻操作一样,负向后视是零宽度,这意味着它不会改变光标位置。这就是为什么你可以像我一样将两个连续串在一起。我比 | 更喜欢这个,因为它清楚地表明了不允许的两种情况。并且执行两次应该具有与 | 相同的运行时效果。操作员在单个后视中。
【讨论】:
^(?!GB)(?!ZZ)[A-GZ]{2}——还添加了^,因为他指定了“前两个字符”
^([A-F][A-GZ]|G[AC-GZ]|Z[A-G]).*
【讨论】:
^ 以获得验证的“前两个字符”部分...
.* 暗示这是一个全文匹配
^ 和$ 从未在我使用的任何正则表达式语言中隐含...上述模式可以匹配ZZ AA aasdfasd 它只会匹配AA aasdfasd
.*,因此他打算在这里进行完整匹配似乎是合乎逻辑的
matches()方法时Java正则在两端锚定,使用match()方法时Python正则锚定在开头,XML Schema正则始终锚定在两端.这些是我知道的唯一隐式锚定的例子,所以我认为假设读者熟悉这个概念是不安全的。如果您提供需要锚定的正则表达式,则应使用显式锚点,或者在这种情况下解释为什么不需要它们。
^([A-F][A-GZ]|G[AC-GZ]|Z[A-G])
【讨论】: