我正在努力制作一个完全抛弃前瞻的正则表达式匹配。
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
这是匹配,这是我的regex101 test。
但是,当电子邮件以-
或_
或.
开头时,它不应完全匹配,而不仅仅是删除初始符号。我欢迎任何想法,我一直在搜索过去的半小时,但无法弄清楚如何从这些符号开始时删除整个电子邮件。
答案 0 :(得分:3)
您可以在SyncTaskExecutor
附近使用带有负后看的单词边界来检查我们是在字符串的开头还是在空白之后,然后检查第一个符号是否在不需要的类{{{ 1}}:
@
请参阅demo
比赛清单:
[^\s\-_.]
关于使用和备选表示法的其他说明
请注意,最好在正则表达式中使用尽可能少的转义字符,因此,(?<=^|\s)[^\s\-_.]\w*(?:[-+.]\w+)*\b@\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*
可以写为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
,字符类末尾的连字符仍然是表示文字连字符,而不是范围。此外,如果您计划在其他正则表达式引擎中使用该模式,您可能会在lookbehind中发现更改时遇到困难,然后您可以将[^\s\-_.]
替换为等效的[^\s_.-]
。见this regex:
(?<=\s|^)
最后但并非最不重要的是,如果您需要在JavaScript或其他不支持外观的语言中使用它,请将(?<!\S)
/ (?<!\S)[^\s_.-]\w*(?:[-+.]\w+)*\b@\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*
替换为(非)捕获组(?<!\S)
,用另一组捕获括号包装整个电子邮件模式部分,并使用语言方法获取第1组内容:
(?<=\s|^)
请参阅regex demo。
答案 1 :(得分:1)
我将此用于多个电子邮件地址,与';'分开:
([A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4};)*
对于一封邮件:
[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}