【问题标题】:Regex invalid group error while using in javascript在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"]*(?"&lt;name&gt;".*?)[\"]*?\s*[&lt;(]?(?"&lt;email&gt;"\S+@[^\s&gt;)]+)[&gt;)]?/: Invalid group”

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

我不擅长正则表达式,需要一些建议。有人可以指出我正确的方向吗?

PS:我正在尝试将此功能与jquery validate插件集成

Jquery Validation

【问题讨论】:

  • 正则表达式的“”和“”部分在我看来是非常错误的。

标签: javascript jquery regex validation jquery-validate


【解决方案1】:

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

命名的捕获位是(?&lt;name&gt;.*?)(?&lt;email&gt;\S+@[^\s&gt;)]+)

您可以用编号的捕获组替换命名捕获,更改此:

[\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 等电子邮件的结尾。
  • 对于电子邮件地址的实际验证,我建议您参考这个问题:stackoverflow.com/questions/201323/…
  • 非常感谢!!这真的很有帮助:)
【解决方案2】:

据我所知,没有后视(可能是这样的:(?&lt;=prefix)) 但可能不支持标记匹配((?"&lt;name&gt;"...))。尝试不使用它并按编号引用匹配项:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多