11

只有当字符串不以至少三个“0”或更多结尾时,我才会尝试找到与字符串匹配的正则表达式。直觉上,我试过:

.*[^0]{3,}$

但是当字符串末尾有一个或两个零时,这不匹配。

4

4 回答 4

14

如果您必须在没有后向断言的情况下执行此操作(即在 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
于 2012-07-11T12:10:31.977 回答
12

您可以尝试使用负面的后视,即:

(?<!000)$

测试:

Test  Target String   Matches
1     654153640       Yes
2     5646549800      Yes   
3     848461158000    No
4     84681840000     No
5     35450008748     Yes   

但请记住,并非每种语言都支持负面的后视。

于 2012-07-11T11:13:12.300 回答
3

不向后看,更通用的有什么问题^(.(?!.*0{3,}$))*$

一般模式是^(.(?!.*++ not-ending-with-pattern$))*$您不必像蒂姆的回答那样对状态机进行逆向工程;您只需在最后插入您不想匹配的模式。

于 2016-01-29T16:09:09.040 回答
1

这是正则表达式不太擅长的事情之一,因为字符串不是很规则(无论这意味着什么)。我能想出的唯一方法就是给它一切可能性。

.*[^0]..$|.*.[^0].$|.*..[^0]$

这简化为

.*([^0]|[^0].|[^0]..)$

如果您只想要不以三个 0 结尾的字符串,那很好,但不以十个 0 结尾的字符串会很长。但值得庆幸的是,这个字符串比其中一些组合更规则,您可以进一步简化它。

.*[^0].{0,2}$
于 2012-07-11T11:15:36.010 回答