在javascript中使用时正则表达式无效组错误

时间:2014-02-25 14:02:17

标签: javascript jquery regex validation jquery-validate

我有以下正则表达式,用于检查多种类型的电子邮件地址输入

[\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中使用它时,我收到错误“未捕获的SyntaxError:无效的正则表达式:/[\W"]*(?"<name>".*?)[\"]*?\s*[<(]?(?"<email>"\S+@[^\s>)]+)[>)]?/:无效的组”

我花了一整天的时间来解决这个问题,我发现问题与 lookbehind 有关javascript不支持

我对正则表达式表达非常不满意,需要一些建议。有人可以指出我正确的方向。

PS:我正在尝试将此功能与jquery validate plugin

集成

Jquery Validation

3 个答案:

答案 0 :(得分:3)

浏览器中的JavaScript通常不支持命名捕获。

命名捕获位是(?<name>.*?)(?<email>\S+@[^\s>)]+)

您可以使用编号的捕获组替换命名捕获,并将其更改为:

[\W"]*(?<name>.*?)[\"]*?\s*[<(]?(?<email>\S+@[^\s>)]+)[>)]?

到此:

[\W"]*(.*?)[\"]*?\s*[<(]?(\S+@[^\s>)]+)[>)]?

Regular expression visualization

所以在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
}

请记住,捕获组只有在捕捉到某些内容时才会被添加。

答案 1 :(得分:0)

:之后添加(?以防止引用paranthesis:

/[\W"]*(?:"<name>".*?)[\"]*?\s*[<\(]?(?:"<email>"\S+@[^\s>)]+)[>)]?/

答案 2 :(得分:0)

据我所知,它没有任何后盾(它是这样的:(?<=prefix)) 但也许不支持标记匹配((?"<name>"...))。尝试没有它,并通过他们的号码引用匹配:

/[\W"]*(.*?)[\"]*?\s*[<(]?(\S+@[^\s>)]+)[>)]?/

名称将是第一个,电子邮件是第二个被捕获的组