正则表达式只匹配第一个零之后的零

Sam*_*Sam 34 regex

使用正则表达式,如何确保第一个零后面除了零之外什么都没有?

ABC1000000 - valid
3212130000 - valid
0000000000 - valid
ABC1000100 - invalid
0001000000 - invalid
Run Code Online (Sandbox Code Playgroud)

未经验证的正则表达式将类似于 - [A-Z0-9]{10},确保它是 10 个字符。

The*_*ird 32

您可以将模式更新为:

^(?=[A-Z0-9]{10}$)[A-Z1-9]*0+$
Run Code Online (Sandbox Code Playgroud)

模式匹配:

  • ^字符串的开头
  • (?=[A-Z0-9]{10}$)正向前瞻,断言 10 个允许的字符
  • [A-Z1-9]*可选择匹配任意字符[A-Z1-9]
  • 0+匹配 1+ 个零
  • $字符串结尾

正则表达式演示

如果也允许不带零的值,则最后一个量词可以匹配 0 次或多次(以及使用否定字符类的@Deduplicator*注释的更短版本):

^(?=[A-Z0-9]{10}$)[^0]*0*$
Run Code Online (Sandbox Code Playgroud)

使用 JavaScript 的示例:

^(?=[A-Z0-9]{10}$)[A-Z1-9]*0+$
Run Code Online (Sandbox Code Playgroud)


作为不使用环视的替代方案,您还可以匹配您不想要的内容,并在第 1 组中捕获您想要保留的内容。

为了确保第一个零之后只有零,您可以在匹配 0 后跟 1 个相同范围的字符(不含 0)后立即停止匹配。

在交替中,第二部分可以捕获 A-Z0-9 范围内的 10 个字符。

^(?:[A-Z1-9]*0+[A-Z1-9]|([A-Z0-9]{10})$)
Run Code Online (Sandbox Code Playgroud)

模式匹配:

  • ^字符串的开头
  • (?:交替的非捕获组|
    • [A-Z1-9]*0+[A-Z1-9]匹配不应该出现的内容,在本例中是一个零,后跟一个来自不带零的范围的字符
    • |或者
    • ([A-Z0-9]{10})捕获组 1,匹配范围内的 10 个字符[A-Z0-9]
  • $字符串结尾
  • )关闭非捕获组

正则表达式演示


Mar*_*ijn 22

0[^0]

  • a0后跟 NOT a0

我用 JS 编写它,因为它更容易测试,但它也适用于其他语言。注意:它不检查长度,但是这个正则表达式要容易得多,将其与长度检查结合起来就可以了。

如果正则表达式匹配,则该字符串无效:)在控制台中,我已经否定了它,以告诉您它是否有效:

const strings = [
  'BC1000000',
  '3212130000',
  '0000000000',
  'ABC1000100',
  '0001000000',
  '1000000000',
  '10000000000',
  '1000000001'
];

strings.forEach(element => {
    console.log(
        element,
        // true means length 10 and only trailing zeros 
        !/0[^0]/.test(element) && element.length == 10  
    )
});
Run Code Online (Sandbox Code Playgroud)


Dan*_*nez 12

您可以使用前瞻来匹配 10 个字符的字符串。然后,从字符串开头匹配除 0 之外的所有内容,然后只匹配 0,直到字符串末尾:

^(?=.{10}$)[^0]*0+$
Run Code Online (Sandbox Code Playgroud)

这适用于您的所有测试用例。如果不需要 0,可以将最后一个 0 之后的一对多符号更改为零或多个 (*)。


Car*_*and 11

您还可以使用否定:

^(?=[\dA-Z]{10}$)(?!.*0[^0\r\n])
Run Code Online (Sandbox Code Playgroud)

(?!.*0[^0\r\n])是一个负向先行,断言除行终止符之外不存在后跟非零的零。也可以写成(?!.*0[1-9A-Z]).

演示


ilk*_*chu 5

如果您将其作为程序/脚本的一部分来执行,并且不仅仅局限于一个正则表达式,那么分两步进行测试可能会更容易。在一次测试中检查零,单独检查长度。

测试所有零是否都在尾部的正则表达式很简单^[^0]*0*$(或者^[A-Z1-9]*0*$对于更有限的允许字符集);在任何编程语言中检查字符串长度都很容易。

例如,在 Perl 中,这将打印匹配的输入行(chomp删除换行符):

perl -lne 'chomp; print if /^[^0]*0*$/ && length == 10'
Run Code Online (Sandbox Code Playgroud)

(如果您需要末尾至少有一个零,则使用...0+$(或在 BRE 中)。)...00*$