Firefox gives SyntaxError: invalid regexp group

Firefox gives SyntaxError: invalid regexp group

我几乎没有用于表单验证的正则表达式,我注意到我的项目无法通过 firefox 访问,因为它什么都不显示!但在控制台中给出错误,SyntaxError: invalid regexp group

nicRegex 正在检查我所在国家/地区的国民身份证。根据当前格式,格式应为 937962723V937962723X 或任何 11 位数字。

phoneRegex 是用我的国家代码检查 phone 号码。 941212121210762323232

const nicRegex = /^(?:19|20)?\d{2}(?:[01235678]\d\d(?<!(?:000|500|36[7-9]|3[7-9]\d|86[7-9]|8[7-9]\d)))\d{4}(?:[vVxX])$/;

这里使用负向后视(Safari目前不支持)来限制前三位数字。这个限制可以用负前瞻同样很好地执行,只需要将它放在 之前 3 位数模式:

(?:[0-35-8]\d\d(?<!(?:000|500|36[7-9]|3[7-9]\d|86[7-9]|8[7-9]\d)))

应该看起来像

(?!000|500|36[7-9]|3[7-9]\d|86[7-9]|8[7-9]\d)[0-35-8]\d\d

注意非捕获组在这里是多余的,我删除了它们,[01235678] = [0-35-8].

最终的正则表达式看起来像

/^(?:19|20)?\d{2}(?!000|500|36[7-9]|3[7-9]\d|86[7-9]|8[7-9]\d)[0-35-8]\d\d\d{4}[vVxX]$/

regex demo and the Regulex graph

TLDR;谨慎使用命名捕获组(或者干脆不使用它们)

对我来说,这是因为我认为我会很聪明并尝试在我的正则表达式中使用命名捕获组...Firefox 惩罚了我。

无效: /(?<text>[a-z]+)/

有效: /([a-z]+)/