【发布时间】:2018-10-10 19:18:48
【问题描述】:
我正在尝试匹配字符串中的所有英国电话号码。
这个模式是:
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$
但是当我尝试发起一个新的RegExp 时:
const myRegex = RegExp('^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$','g');
我得到这个错误:
未捕获的语法错误:无效的正则表达式:/^(?(?:(?:0(?:0|11))?[s-]?(?|+)44)?[s-]?(? (?:0)?[s-]?(?)?|0)(?:d{2})?[s-]?d{4}[s-]?d{4}|d{3} )?[s-]?d{3}[s-]?d{3,4}|d{4})?[s-]?(?:d{5}|d{3}[s-] ?d{3})|d{5})?[s-]?d{4,5}|8(?:00[s-]?11[s-]?11|45[s-]?46 [s-]?4d))(?:(?:[s-]?(?:x|ext.?s?|#)d+)?)$/: 无效组
【问题讨论】:
-
我的问题是为什么?您为什么决定为此使用正则表达式?这似乎过于复杂。你的最终目标是什么?我认为,如果您向我们提供您想要匹配和不匹配的样本,我们可以为您提供更好的回复/答案。就个人而言,我认为正则表达式的格式不正确或不应该专门用于您的情况。似乎您已将规则添加到您的正则表达式中,只需捕获这些部分,然后针对某些值测试它们。
-
所以正则表达式可能是正确的,regex101 不会抱怨。但是,由于未转义的斜杠,它是无效的 JavaScript 正则表达式 -
/....\..../不需要它们而不是字符串 -
与文字正则表达式不同,您需要在
RegExp构造函数中正确转义,因为字符串也有转义 - 这会导致双重转义,例如\\(. -
@ctwheels:这没有回答“为什么这是一个无效的正则表达式?”这个问题。 .
标签: javascript regex