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

标签 javascript regex

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

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

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

var regexString = /^\D*(?!(\s*\d\s*){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?相反,尝试

^(?!.*(\d\s*){10}).*

这确保每个 位置后面都没有(10 位数字,可能以空格分隔)。

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

如果数字只能出现在字符串中的单个 block 中(可能由空格分隔),那么如果您处于支持所有格 量词的环境中,您的模式就可以工作,这可以防止回溯,例如:

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

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

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

关于javascript - 正则表达式不匹配具有 10 个连续数字的字符串。数字可以用空格分隔。所有其他字符串返回一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55719582/

相关文章:

javascript - d3 以文本形式强制定向节点 - 计算相对箭头指向位置

javascript - 将 HTTP header 时间戳转换为另一种日期时间格式

javascript - Import.meta.env 在生产构建 vitejs 上未定义

mysql - 如何在MySQL中使用正则表达式用随机数更新和替换字符串?

Java 正则表达式生成模式

java - 正则表达式匹配,当目标字符串中存在向后移动的模式时?

javascript - 如何通过 ng-init 或 value 标签设置 ng-model 值

javascript - AngularJS 可以在刷新时监听 $locationChangeSuccess 吗?

java - 正则表达式忽略已声明的变量初始化

javascript - 在 JavaScript 中使用 RegEx 进行拆分