正则表达式匹配不以模式结尾的字符串

时间:2012-07-11 11:05:13

标签: regex regex-negation

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

.*[^0]{3,}$

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

4 个答案:

答案 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}$