我尝试找到一个匹配字符串的正则表达式,只有当字符串不以至少三个'0'或更多结尾时才会结束。直觉上,我试过了:
.*[^0]{3,}$
但是当字符串末尾有一个或两个零时,这就不匹配了。
答案 0 :(得分:13)
如果你必须这样做而没有外观断言(即在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
答案 1 :(得分:8)
您可以尝试使用负面观察,即:
(?<!000)$
试验:
Test Target String Matches
1 654153640 Yes
2 5646549800 Yes
3 848461158000 No
4 84681840000 No
5 35450008748 Yes
请注意,每种语言都不支持负面观察。
答案 2 :(得分:2)
没有后卫,更通用的^(.(?!.*0{3,}$))*$
?
一般模式为^(.(?!.*
+ not-ending-with-pattern
+ $))*$
。你不必像Tim的回答那样对状态机进行逆向工程;你只需在最后插入你不想匹配的模式。
答案 3 :(得分:1)
这是RegExes不擅长的事情之一,因为字符串不是常规(无论这意味着什么)。我能想出的唯一方法是尽可能地给它。
.*[^0]..$|.*.[^0].$|.*..[^0]$
简化为
.*([^0]|[^0].|[^0]..)$
如果您只希望字符串不以三个0结尾,那么这很好,但是不以十个0结尾的字符串会很长。但幸运的是,这个字符串比其他一些组合更加常规,你可以进一步简化它。
.*[^0].{0,2}$