正则表达式不匹配具有 10 个连续数字的字符串.数字可以用空格分隔.所有其他字符串返回匹配项



我有一个代码笔,有 5/7 个单元测试通过。卡在以非数字字符开头的字符串上。

https://codepen.io/david-grieve/pen/pBpGoO?editors=0012

var regexString = /^D*(?!(s*ds*){10,}).*/;

var regexString = /^D*(?!(s*ds*){10,}).*/;
var tests = [{
text: 'abc123',
ismatch: true
}, {
text: '1234567890',
ismatch: false
}, {
text: '123456789',
ismatch: true
}, {
text: 'abc1234567890efg',
ismatch: false
}, {
text: '123 456 789 123',
ismatch: false
},
{
text: 'abc1234567890',
ismatch: false
}, {
text: '1234567890efg',
ismatch: false
}
];
console.log(new Date().toString());
tests.map(test => console.log(test.text, regexString.test(test.text) == test.ismatch));

使用此正则表达式,以下字符串通过单元测试

  • "ABC123"真
  • "1234567890"真
  • "123456789"真实
  • "123
  • 456 789 123" 真
  • "1234567890efg"真

这些未通过单元测试

  • "abc1234567890"假
  • "abc1234567890efg"假

注意:/^\D{3,}(?!(\s*\d\s*){10,}).*/通过了所有测试,但显然是错误的。

>^D*(?!的问题在于,即使在负前瞻中找到长数字/空格字符串,一旦负前瞻匹配,D匹配的部分也会简单地回溯一个字符。例如,当

^D*(?!d{10,}).*

比赛

abc1234567890

D*匹配ab.*匹配c1234567890bc之间的位置不会跟长数字/空格子字符串,因此匹配不会失败。

此外,由于某些数字可能出现在10 个连续数字之前,因此开头的^D*是不够的 - 例如,如果输入1a01234567890怎么办?相反,请尝试

^(?!.*(ds*){10}).*

这可确保每个位置后面不跟着(10 位数字,可能用空格分隔)。

https://regex101.com/r/v7t4IC/1

如果数字只能出现在字符串中的单个块中(可能用空格分隔),那么如果你在一个支持所有格量词的环境中,你的模式就会起作用,这可以防止回溯,例如:

^D*+(?!(s*ds*){10,}).*
^

https://regex101.com/r/eGdw2l/1

(但不幸的是,Javascript不支持这样的语法)

最新更新