使用正则表达式,如何确保第一个零后面除了零之外什么都没有?
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]0后跟 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 之后的一对多符号更改为零或多个 (*)。
^(?=.{10}$)[^0]*0+$
Run Code Online (Sandbox Code Playgroud)
Car*_*and 11
您还可以使用否定:
^(?=[\dA-Z]{10}$)(?!.*0[^0\r\n])
Run Code Online (Sandbox Code Playgroud)
(?!.*0[^0\r\n])是一个负向先行,断言除行终止符之外不存在后跟非零的零。也可以写成(?!.*0[1-9A-Z]).
如果您将其作为程序/脚本的一部分来执行,并且不仅仅局限于一个正则表达式,那么分两步进行测试可能会更容易。在一次测试中检查零,单独检查长度。
测试所有零是否都在尾部的正则表达式很简单^[^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*$