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

use*_*757 15 regex

我正在寻找一个可以用正则表达式完成的解决方案.我知道这对变量,子串等很容易.

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

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

0001 
1000 
1234 
0101
Run Code Online (Sandbox Code Playgroud)

这不会:

0000
Run Code Online (Sandbox Code Playgroud)

如果这很重要,这是一个子串,它将出现在一个大字符串中的一个设定位置; 我认为不应该.例如

xxxxxxxxxxxx0001xxxxx
xxxxxxxxxxxx1000xxxxx
xxxxxxxxxxxx1234xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0000xxxxx
Run Code Online (Sandbox Code Playgroud)

tch*_*ist 39

 (?<!\d)(?!0000)\d{4}(?!\d)
Run Code Online (Sandbox Code Playgroud)

或者,更仁慈/可维护/理智:

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
Run Code Online (Sandbox Code Playgroud)

  • 读者注意:如果问题不是要求排除较长数字字符串的子串,那么答案就是`(?!0000)\ d {4}`(或`(?!0 {4})\ d {4}`). (3认同)

Ric*_*d J 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])
Run Code Online (Sandbox Code Playgroud)

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