在javascript中使用时正则表达式无效组错误
Posted
技术标签:
【中文标题】在javascript中使用时正则表达式无效组错误【英文标题】:Regex invalid group error while using in javascript 【发布时间】:2014-03-27 19:26:45 【问题描述】:我有以下正则表达式来检查多种类型的电子邮件地址输入
[\W"]*(?<name>.*?)[\"]*?\s*[<(]?(?<email>\S+@[^\s>)]+)[>)]?
我收到了How do I regex a name and an email out of the 3 major email clients in ruby?
我面临的问题是,在 javascript 中使用它时出现错误“Uncaught SyntaxError: Invalid regular expression: /[\W"]*(?"<name>".*?)[\"]*?\s*[<(]?(?"<email>"\S+@[^\s>)]+)[>)]?/
: Invalid group”
我花了一整天的时间试图解决这个问题,我发现问题与 lookbehind javascript 不支持有关
我不擅长正则表达式,需要一些建议。有人可以指出我正确的方向吗?
PS:我正在尝试将此功能与jquery validate插件集成
Jquery Validation
【问题讨论】:
正则表达式的“浏览器中的 JavaScript 通常不支持命名捕获。
命名的捕获位是(?<name>.*?)
和(?<email>\S+@[^\s>)]+)
。
您可以用编号的捕获组替换命名捕获,更改此:
[\W"]*(?<name>.*?)[\"]*?\s*[<(]?(?<email>\S+@[^\s>)]+)[>)]?
到这里:
[\W"]*(.*?)[\"]*?\s*[<(]?(\S+@[^\s>)]+)[>)]?
所以在 JavaScript 中它看起来像这样:
match = subject.match(/[\W"]*(.*?)[\"]*?\s*[<(]?(\S+@[^\s>)]+)[>)]?/i);
if (match != null)
// matched text: match[0]
// match start: match.index
// capturing group 1 (name): match[1]
// capturing group 2 (email): match[2]
else
// Match attempt failed
请记住,只有在捕获某些内容时才可能添加捕获组。
【讨论】:
感谢 Dean,您的建议很有效!除了一个小问题。这个 exp 似乎没有检查 .com 或 .org 等电子邮件的结尾。 对于电子邮件地址的实际验证,我建议您参考这个问题:***.com/questions/201323/… 非常感谢!!这真的很有帮助:)【参考方案2】:据我所知,没有后视(可能是这样的:(?<=prefix)
)
但可能不支持标记匹配((?"<name>"...)
)。尝试不使用它并按编号引用匹配项:
/[\W"]*(.*?)[\"]*?\s*[<(]?(\S+@[^\s>)]+)[>)]?/
名称将是第一个,电子邮件是第二个捕获的组
【讨论】:
以上是关于在javascript中使用时正则表达式无效组错误的主要内容,如果未能解决你的问题,请参考以下文章
当正则表达式有效且在其他地方工作时,带有“m”标志的 Javascript 正则表达式错误、“无效的正则表达式组”
正则表达式否定后向在 JavaScript 中无效 [重复]