就像我在您的问题下方的评论中一样,您可以使用以下正则表达式:
查看正则表达式在这里使用
^(?!9+[98]$|d1{2})d{3,6}$这个怎么运作:
^
在行首声明位置(?!9+[98]$|d1{2})否定前瞻,确保不会继续执行以下任一选项9+[98]$
匹配9
一个或更多次,然后或者9
或8
,则该行的末尾d1{2})匹配任何数字,后跟1
两次
d{3,6}匹配3到6位数字$
在行尾断言位置
由于负先行跟随线锚的开始,我们还要确保在该位置先行启动,这就是为什么
d1{2}比赛011,
111,
211,…,
911而不是
1211或他人。
代码如下:
s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']r = /^(?!9+[98]$|d1{2})d{3,6}$/for (x of s) { console.log(x.match(r) ? x + ': true' : x + ': false')}-
编辑
OP提到了这一点,
999并将其
998放置在字符串中的任何位置均应使其无效:
查看正则表达式在这里使用
^(?!d*9{2}[98]|d1{2})d{3,6}$除负先行中的第一个选项外,与上述相同的正则表达式。现在是
d*9{2}[98],匹配999或
998字符串中的任意位置(以任意数字开头)。
s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']r = /^(?!d*9{2}[98]|d1{2})d{3,6}$/for (x of s) { console.log(x.match(r) ? x + ': true' : x + ': false')}-
编辑#2
OP指出的格式
0N11应无效(而不仅仅是
N11):
查看正则表达式在这里使用
^(?!d*9{2}[98]|[01]?d1{2})d{3,6}$与上述相同的正则表达式,除了负前瞻中的第二个选项。这是现在
[01]?d1{2},匹配0或
1可选的,其次是任何数字,然后
11(所以
011,
111,
211,…,
,
911,
0011,,
0111,…, ,,, ,…,
)。
0211``0311``0911``1011``1111``1211``1911
s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']r = /^(?!d*9{2}[98]|[01]?d1{2})d{3,6}$/for (x of s) { console.log(x.match(r) ? x + ': true' : x + ': false')}


