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



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

尽管我提到了vim,但我正在寻找PCRE风格的regex语法。

我需要用4个数字来识别字符串,它们不能都是0。因此以下字符串将匹配:

0001 
1000 
1234 
0101

但这不会:

0000

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

xxxxxxxxxxxx0001xxxxx
xxxxxxxxxxxx1000xxxxx
xxxxxxxxxxxx1234xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0000xxxxx
 (?<!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-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]来编写更简单的代码。

只匹配4位数字(d{4}应该匹配),然后验证您的匹配不等于'0000'

由于PCRE支持查找,d{4}(?<!0000)将查找四个连续非零字符的任何实例。请在此处查看它的实际操作。

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

测试3位数字(0-9)的序列,然后是仅具有(1-9)的第4位

/d{3}[1-9]/

相关内容

最新更新