正则表达式 - 连续4位数,但不能全为零

时间:2011-06-10 20:42:28

标签: regex

我正在寻找一种只能用正则表达式完成的解决方案。我知道这对变量,子串等很容易。

我正在寻找PCRE风格的正则表达式语法,即使我提到了vim。

我需要识别带有4位数字的字符串,它们不能全为0。所以以下字符串将匹配:

0001 
1000 
1234 
0101

这不会:

0000

如果重要的话,这是一个在大字符串中的设定位置发生的子字符串;我认为不应该。例如

xxxxxxxxxxxx0001xxxxx
xxxxxxxxxxxx1000xxxxx
xxxxxxxxxxxx1234xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0000xxxxx

5 个答案:

答案 0 :(得分:37)

 (?<!\d)(?!0000)\d{4}(?!\d)

或更善良/可维护/理智:

m{
     (?<! \d   )    # current point cannot follow a digit
     (?!  0000 )    # current point must not precede "0000"
     \d{4}          # match four digits at this point, provided...
     (?!  \d   )    # that they are not then followed by another digit
}x

答案 1 :(得分:5)

由于我抱怨这里的一些答案不是正则表达式,我认为我最好给你一个正则表达式的答案。这是原始的,可能有更好的方法,但确实有效:

([1-9][0-9][0-9][0-9]|[0-9][1-9][0-9][0-9]|[0-9][0-9][1-9][0-9]|[0-9][0-9][0-9][1-9])

这将检查每个位置包含0-9的内容,但必须位于1-9中的内容除外,以防止0000匹配。如果你的正则表达式解析器支持那个元字符,你可以使用\ d而不是[0-9]来编写这个更简单。

答案 2 :(得分:4)

由于PCRE支持lookarounds\d{4}(?<!0000)将找到四个连续非零字符的任何实例。在行动here中查看。

如果您必须确保匹配仅发生在字符串的正确位置,则可以改为使用^.{X}\d{4}(?<!0000).{Y}$,其中XY是前后字符的数量,分别(在你的例子中为12和5)。

答案 3 :(得分:3)

只需匹配4位数字(\d{4}即可),然后确认您的匹配不等于'0000'

答案 4 :(得分:0)

测试3位数字(0-9),然后是仅4位(1-9)的数字

/\d{3}[1-9]/