角度反应表单模式验证:无效的正则表达式

时间:2018-01-29 03:32:13

标签: regex angular validation

我在AngularJS网站上有一个正在进行澳大利亚电话号码验证的正则表达式。我在Reactive Forms验证器中设置了确切的模式,如下所示:

 Validators.pattern(
  '/^({0,1}((0|+61)(2|4|3|7|8))){0,1}( |-){0,1}[0-9]{2}( |-){0,1}[0-9]{2}( |-){0,1}[0-9]{1}( |-){0,1}[0-9]{3}$/'
 )

页面无法加载,因为它收到以下错误:

  

无效的正则表达式:/ ^ / ^({0,1}((0 | +61)(2 | 4 | 3 | 7 | 8))){0,1}(| - ){0,1 } [0-9] {2}(| - ){0,1} [0-9] {2}(| - ){0,1} [0-9] {1}(| - ){0, 1} [0-9] {3} $ / $ /:无需重复

使用Reactive Forms时指定此模式的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

有很多问题:

  • 不应在引号内使用正则表达式文字(或使用带有双重转义特殊字符的字符串模式)
  • 必须转发()+之类的特殊字符 - 无需重复是由((启动)引起的捕获组的数量用{0,1}量化,这是一个错误
  • {0,1}等于?( |-)可写为[ -](2|4|3|7|8)可写为[23478]

所以,你可以使用

Validators.pattern(
  '^\\(?(0|\\+61)[24378]\\)?[ -]?[0-9]{2}[ -]?[0-9]{2}[ -]?[0-9][ -]?[0-9]{3}$'
)

请注意,您甚至可以省略^$,因为Angular会自动将锚点添加到字符串模式中。

注意:如果分隔符应该是一致的,则捕获第一个分隔符,然后使用反向引用到组值:

Validators.pattern(
  '\\(?(?:0|\\+61)[24378]\\)?([ -]?)[0-9]{2}\\1[0-9]{2}\\1[0-9]\\1[0-9]{3}'
)

答案 1 :(得分:0)

将模式作为字符串传递,没有/哪个是正则表达式的分隔符

Validators.pattern('^({0,1}((0|+61)(2|4|3|7|8))){0,1}( |-){0,1}[0-9]{2}( |-){0,1}[0-9]{2}( |-){0,1}[0-9]{1}( |-){0,1}[0-9]{3}$/')