我正在使用角度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 });
是否有任何方法可以替换\
字符以使其正常工作?
答案 0 :(得分:2)
这是X-Y Problem。每个人都在关注您的原始问题标题,该问题询问有关在正则表达式中转义文字\
的问题。那不是问题。
首先,在JavaScript中,数字可以用多种方式表示。其中之一是octal literal notation,,在数字(字符代码)前加上\
。
您的正则表达式包含\1
,它被解释为octal,这是您的错误消息。八进制转义序列have been deprecated,这就是strictmode引发错误的原因,这是您面临的实际问题。
如果通过将\1
转义为\\1
来解决了编译错误,则生成的this expression parsing会执行任何一位数字的否定预读,然后执行文字字符“ \”,后跟任意次数的数字“ 1” 。
您还将注意到,区号括号是可选的,但它需要在左括号后加上文字+
(因为它以\+
的形式转义了)。 那当然不是您想要的。
您想要的正则表达式可能是one of the answers from this question
"^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$"
其中parses to个
第二,Angular's PatternValidator将字符串转换为正则表达式,因此只需传入字符串而不用正斜杠将其括起来即可。
答案 1 :(得分:0)
以下正则表达式将允许您匹配或替换反斜杠:
/\\/ //
(1)匹配一个反斜线(仅第一个出现)
/\\/g //
(2)匹配任何反斜杠(全局搜索)
re1 = new RegExp("\\\\","")
//与(1)相同,带有RegExp构造函数
re2 = new RegExp("\\\\","g")
//与(2)相同,带有RegExp构造函数
基于this的文章。
根据角度docs,Validators.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所述。