只有当字符串不以至少三个“0”或更多结尾时,我才会尝试找到与字符串匹配的正则表达式。直觉上,我试过:
.*[^0]{3,}$
但是当字符串末尾有一个或两个零时,这不匹配。
只有当字符串不以至少三个“0”或更多结尾时,我才会尝试找到与字符串匹配的正则表达式。直觉上,我试过:
.*[^0]{3,}$
但是当字符串末尾有一个或两个零时,这不匹配。
如果您必须在没有后向断言的情况下执行此操作(即在 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
您可以尝试使用负面的后视,即:
(?<!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
。$))*$
您不必像蒂姆的回答那样对状态机进行逆向工程;您只需在最后插入您不想匹配的模式。
这是正则表达式不太擅长的事情之一,因为字符串不是很规则(无论这意味着什么)。我能想出的唯一方法就是给它一切可能性。
.*[^0]..$|.*.[^0].$|.*..[^0]$
这简化为
.*([^0]|[^0].|[^0]..)$
如果您只想要不以三个 0 结尾的字符串,那很好,但不以十个 0 结尾的字符串会很长。但值得庆幸的是,这个字符串比其中一些组合更规则,您可以进一步简化它。
.*[^0].{0,2}$