【发布时间】:2012-07-11 11:05:13
【问题描述】:
仅当字符串不以至少三个 '0' 或更多结尾时,我才会尝试查找与字符串匹配的正则表达式。直觉上,我试过了:
.*[^0]{3,}$
但是当字符串末尾有一个或两个零时,这不匹配。
【问题讨论】:
标签: regex regex-negation
仅当字符串不以至少三个 '0' 或更多结尾时,我才会尝试查找与字符串匹配的正则表达式。直觉上,我试过了:
.*[^0]{3,}$
但是当字符串末尾有一个或两个零时,这不匹配。
【问题讨论】:
标签: regex regex-negation
如果您必须在没有后向断言的情况下执行此操作(即在 JavaScript 中):
^(?:.{0,2}|.*(?!000).{3})$
否则,使用 hsz 的答案。
说明:
^ # Start of string
(?: # Either match...
.{0,2} # a string of up to two characters
| # or
.* # any string
(?!000) # (unless followed by three zeroes)
.{3} # followed by three characters
) # End of alternation
$ # End of string
【讨论】:
您可以尝试使用否定的look-behind,即:
(?<!000)$
测试:
Test Target String Matches
1 654153640 Yes
2 5646549800 Yes
3 848461158000 No
4 84681840000 No
5 35450008748 Yes
但请记住,并非所有语言都支持负面的后视。
【讨论】:
不向后看、更通用的^(.(?!.*0{3,}$))*$ 有什么问题?
一般模式是^(.(?!.* + not-ending-with-pattern + $))*$。您不必像蒂姆的回答那样对状态机进行逆向工程;你只需在最后插入你不想匹配的模式。
【讨论】:
这是 RegEx 不太擅长的事情之一,因为字符串不是很常规(不管这意味着什么)。我能想出的唯一方法就是给它所有的可能性。
.*[^0]..$|.*.[^0].$|.*..[^0]$
简化为
.*([^0]|[^0].|[^0]..)$
如果您只想要不以三个 0 结尾的字符串,那很好,但不以十个 0 结尾的字符串会很长。但幸运的是,这个字符串比其中一些组合更正规,你可以进一步简化它。
.*[^0].{0,2}$
【讨论】: