正则表达式邮箱校验:如何让分组匹配至最后一个@符号之前
嘿,我完全get到你的需求了——就是不管邮箱前缀里夹杂多少个@符号,都要精准捕获最后一个@之前的所有内容对吧?之前用环视没成功大概率是没结合贪婪匹配的特性,我给你两种靠谱的解决方案:
方案1:贪婪匹配+捕获分组
直接用这个正则就能搞定:
^(.*)@
^锚定字符串的开头,避免匹配到邮箱域名里的@(不过邮箱域名里本来也不会有@,这个是保险).*是贪婪模式的任意字符匹配,它会拼尽全力抓取字符,直到碰到最后一个@符号才停下@匹配那个收尾的@符号- 你要的内容就在第一个捕获分组里(也就是
(.*)抓到的部分),比如:- 输入
my-email@outlook.com→ 分组结果:my-email - 输入
my-@-email@outlook.com→ 分组结果:my-@-email
- 输入
方案2:用正向环视(Lookahead)实现无分组匹配
如果想用你提到的环视功能,正向预查是绝佳选择,正则如下:
^.*(?=@)
(?=@)是正向预查断言,它只会检查当前位置的后面紧跟的是@,但不会把@包含到最终的匹配结果里- 同样依赖
.*的贪婪特性,它会一直匹配到最后一个满足“后面是@”的位置,直接返回你需要的前缀内容,连分组都不用额外提取
为啥之前用环视可能失败?
大概率是你不小心用了非贪婪模式(.*?),比如如果写成^.*?(?=@),它会匹配到第一个@之前的内容,这就和你的需求背道而驰了。记住:要抓最后一个匹配项,就用贪婪的.*;要抓第一个,才用非贪婪的.*?。
内容的提问来源于stack exchange,提问作者Devbizz
相关产品推荐
相关产品推荐

