模块解析失败:严格模式下的八进制文字

时间:2019-06-01 22:11:37

标签: regex angular

我正在使用角度7并使用验证联系电话

"^(?!(\d)\1+$)(?:\(?\+\d{1,3}\)?[- ]?|0)?\d{10}$"

正则表达式,但抛出以下错误:Module parse failed: Octal literal in strict mode (10:76)

我已经尝试使用\\而不是\,因为根据我的发现,问题出在\字符上。

registerForm = this.fb.group(
{
  email:['', [Validators.required, Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+.com$')]],
  contact:['',[Validators.required, Validators.pattern('/^(?!(\d)\1+$)(?:\(?\+\d{1,3}\)?[- ]?|0)?\d{10}$/')]],
  password:['',[Validators.required]],
  confirmPassword:['',[Validators.required]]
},{ validator: PasswordMatchValidator });

是否有任何方法可以替换\字符以使其正常工作?

5 个答案:

答案 0 :(得分:2)

这是X-Y Problem。每个人都在关注您的原始问题标题,该问题询问有关在正则表达式中转义文字\的问题。那不是问题。

首先,在JavaScript中,数字可以用多种方式表示。其中之一是octal literal notation,,在数字(字符代码)前加上\

您的正则表达式包含\1,它被解释为octal,这是您的错误消息。八进制转义序列have been deprecated,这就是strictmode引发错误的原因,这是您面临的实际问题。

如果通过将\1转义为\\1来解决了编译错误,则生成的this expression parsing会执行任何一位数字的否定预读,然后执行文字字符“ \”,后跟任意次数的数字“ 1”

railroad diagram of a completely broken phone number validator

您还将注意到,区号括号是可选的,但它需要在左括号后加上文字+(因为它以\+的形式转义了)。 那当然不是您想要的。

您想要的正则表达式可能是one of the answers from this question

"^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$"

其中parses to

railroad diagram of a fairly good phone number validator

第二,Angular's PatternValidator将字符串转换为正则表达式,因此只需传入字符串而不用正斜杠将其括起来即可。

答案 1 :(得分:0)

  

以下正则表达式将允许您匹配或替换反斜杠:

     

/\\/ //(1)匹配一个反斜线(仅第一个出现)

     

/\\/g //(2)匹配任何反斜杠(全局搜索)

     

re1 = new RegExp("\\\\","") //与(1)相同,带有RegExp构造函数

     

re2 = new RegExp("\\\\","g") //与(2)相同,带有RegExp构造函数

基于this的文章。

根据角度docsValidators.pattern方法接受string | RegExp。就您而言,它会在使用之前将string转换为RegExp。因此,您需要使用\\\\的反斜杠才能获得常规的\的反斜杠。

答案 2 :(得分:0)

这里有一些问题,但我将从这个问题开始:/字符用于开始和结束javascript中的RegExp文字,它不是模式的一部分。您不应该将其放在引号(作为字符串文字)内,因为angular会错误地尝试制作包含/的模式。

代替:

Validators.pattern('/^(?!(\d)\1+$)(?:\(?\+\d{1,3}\)?[- ]?|0)?\d{10}$/')

删除字符串单引号:

Validators.pattern(/^(?!(\d)\1+$)(?:\(?\+\d{1,3}\)?[- ]?|0)?\d{10}$/)

我很确定这仍然不是您想要的正则表达式,它看起来像是在转义您不应该使用的括号,但这至少是有效的。

您最初从哪里获得图案?如果您同意我们可以对其进行排序,或者尝试在https://regexr.com上播放,当正确使用该模式时,只需直接复制就可以了,那里没有引号或其他转义符。

(令人困惑的是,Validators.pattern 接受string,但是如果要传递字符串,则应省略/,因为这些正斜杠是实际上不是模式的一部分,并且在传递字符串时还应该省略^$,因为Angular adds them automatically

侧面说明:使用正则表达式验证电话号码可能不是一个好主意。 Google libphonenumber

答案 3 :(得分:0)

实际上,如果您使用文字声明(不带引号),则可以使用\1

const regex = /someregex\1/gm;

答案 4 :(得分:-1)

您可以使用“ \”两次来代表实际的“ \”,如here所述。