JavaScript的无效正则表达式组

3

我正在尝试使用这个正则表达式验证电话号码:

\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})

在Angular 2中使用FormBuilder的Validator.pattern时,我遇到了关于无效组的错误:
无效的正则表达式:/^(?(d{3}))?(d{3})(d{4})$/: 无效的组
我做错了什么?

你是将它作为字符串传递的吗?如果是这样,那么你必须进行双重转义...但是你可以将其作为RegExp传递:/^...$/,因此你不需要为\d使用双重转义。 - developer033
1个回答

2

Validator.pattern 是 JavaScript 代码的一部分,支持转义序列(例如 LF 符号 \n、CR 符号 \r 等)的字符串字面量。因此,反斜杠无法与一个未知字符一起使用,"\d" 就是一个未知的转义序列,所以反斜杠会被移除(这就是 JavaScript 作者决定解决这些情况的方式)。

请注意,默认情况下,Validators.pattern 中的所有字符串模式都是锚定的,格式如下:^ + <provided_pattern> + $。因此,如果您的模式包含交替项,请确保所有的交替项都被分组(即不要使用 "az|bz",而要使用 (?:az|bz))。否则,请使用带有锚点的正则表达式。

因此,您可以做的是对特殊字符进行双重转义:

"\\(?(\\d{3})\\)?[- ]?\\d{3}[- ]?\\d{4}"

或者,使用
/^\(?(\d{3})\)?[- ]?\d{3}[- ]?\d{4}$/

如果您没有使用反向引用,那么在验证过程中捕获组是多余的。


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