如何在Javascript中使用正则表达式匹配确切位数的数字

4
在JavaScript中,我所做的是以下操作: ``` var matched = searched.match(/\d{7}/) ``` 如果`searched`为`1234567`或`XYZ1234567`,它运作良好。两者都返回`1234567`,这很好。而`123`和`XYZ123`则返回null,这是预期的。 但是当`searched`为`12345678`或`XYZ12345678`时,其中一个条件失败了。我希望它们两个都返回null,因为我要寻找恰好7位数字匹配。它们两个返回的是`2345678`。 `/\d{7}$/`也不起作用。 请问有人可以提供建议吗? 谢谢。

强制使用字符串的开头和结尾是否有效? /^(\d{7})$/ - Adam Konieska
你需要一个正则表达式,它由7个连续数字组成,并且要么被字符串的开头/结尾限定,要么被非数字字符限定。 - jfriend00
2个回答

4

(?:\D|^): 以非数字开头

(?:\D|$): 以非数字结尾

var matched = searched.match(/(?:\D|^)(\d{7})(?:\D|$)/);
if (matched) { 
  matched = matched[1]; 
}

你可以使用\D代替[^\d],这也会匹配abc1234567中的c1234567 - lintmouse
谢谢。我不知道 JavaScript 的非捕获组的真正行为。 - Fabricator
你可以将其简化为 var [, matched] = searched.match(regex) || [],但如果你保持原样我也完全理解。这一行代码有点晦涩难懂。 - 3limin4t0r

2
您可以使用基于前后查找的正则表达式。自2020年6月30日起,Firefox支持正则表达式中的后向查找,因此浏览器中的后向查找功能正在逐渐得到普及。
使用:
 /(?<!\d)\d{7}(?!\d)/

或者,要查找所有出现的情况,
/(?<!\d)\d{7}(?!\d)/g

看一下正则表达式演示(?<!\d) 负向零宽断言匹配任何不紧跟在数字后面的位置,\d{7} 匹配七个数字,(?!\d) 负向预查要求右侧没有数字。

const values = ['1234567A', 'XYZ1234567A', '12345678', 'XYZ12345678'];
const regex = /(?<!\d)\d{7}(?!\d)/g;
for (let val of values) {
  console.log(val, '\nMatch found:',
       /(?<!\d)\d{7}(?!\d)/.test(val), '\nMatch value: ',
       Array.from(val.matchAll(regex), m => m[0])
  )
}

输出:

1234567A 
Match found: true 
Match value:  [
  "1234567"
]
XYZ1234567A 
Match found: true 
Match value:  [
  "1234567"
]
12345678 
Match found: false 
Match value:  []
XYZ12345678 
Match found: false 
Match value:  []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接