【问题标题】:Why this is an invalid regular expression? [duplicate]为什么这是一个无效的正则表达式? [复制]
【发布时间】: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


【解决方案1】:

错误已经告诉您问题所在。字符串文字中的\ 是转义字符。但是转义不需要转义的字符只是“丢弃”\

console.log('\(');

因此,您传递给正则表达式引擎的值(以及错误显示的内容)是:

^(?(?...

(注意:没有反斜杠)

(?( 不是正则表达式中的有效字符序列。

你要么必须

【讨论】:

  • 我试图逃避转义: new RegExp("^\\(?(?:(?:0(?:0|11))?[\s ...etc给出同样的错误
  • 您当然必须转义 all 转义字符。但是使用正则表达式文字会容易得多。
  • 不妨说它使用与双引号字符串相同的规则并完成它。
  • @sln: 不确定我理解...
  • 是的,你知道 "\\a" = "\\\a" = '\\a' = '\\\a' 和 "\n" = '\n' = 换行符,和 "\x20" = '\x20' = 空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2020-01-25
  • 2020-06-16
  • 2012-08-03
  • 1970-01-01
  • 2020-11-27
  • 2012-01-26
相关资源
最近更新 更多