我正在尝试进行正则表达式匹配,这完全抛弃了前瞻性.
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
Run Code Online (Sandbox Code Playgroud)
这是匹配,这是我的regex101测试.
但是,当一封电子邮件,开始-或者_或.不应该完全匹配它,而不是仅仅删除初始符号.欢迎任何想法,我一直在寻找过去半小时,但无法弄清楚如何从这些符号开始时删除整个电子邮件.
您可以使用带有负向后查找的单词边界@来检查我们是否位于字符串的开头或紧接在空格之后,然后检查第一个符号是否不在不需要的类内[^\s\-_.]:
(?<=^|\s)[^\s\-_.]\w*(?:[-+.]\w+)*\b@\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*
Run Code Online (Sandbox Code Playgroud)
查看演示
比赛名单:
support@github.com
s.miller@mit.edu
j.hopking@york.ac.uk
steve.parker@soft.de
info@company-hotels.org
kiki@hotmail.co.uk
no-reply@github.com
s.peterson@mail.uu.net
info-bg@software-software.software.academy
Run Code Online (Sandbox Code Playgroud)
有关用法和替代符号的附加说明
请注意,最佳实践是在正则表达式中使用尽可能少的转义字符,因此, 可以[^\s\-_.]写为[^\s_.-],字符类末尾的连字符仍然表示文字连字符,而不是范围。另外,如果您打算在其他正则表达式引擎中使用该模式,您可能会发现后向查找中的交替有困难,然后您可以用(?<=\s|^)等效的(?<!\S). 请参阅此正则表达式:
(?<!\S)[^\s_.-]\w*(?:[-+.]\w+)*\b@\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的一点是,如果您需要在 JavaScript 或其他不支持环视的语言中使用它,请将 / 替换(?<!\S)为(?<=\s|^)(非)捕获组(\s|^),用另一组捕获括号包裹整个电子邮件模式部分,并使用语言方法来抓取第 1 组内容:
(\s|^)([^\s_.-]\w*(?:[-+.]\w+)*\b@\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*)
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示。