正则表达式提取简历邮箱误匹配手机号的解决方法咨询
解决简历邮箱提取时误匹配手机号的问题
你的正则之所以会把手机号和邮箱一起匹配,是因为原规则没有限制邮箱本地部分的起始条件——数字属于邮箱本地名允许的字符,所以连续的手机号会被当作邮箱本地名的一部分纳入匹配范围。
针对你的场景,有两种可行的修改方案:
方案1:强制邮箱本地名以字母开头(适合简历中邮箱均为字母开头的场景)
修改正则,让邮箱本地部分必须以字母开头,这样就会自动跳过前面的纯数字手机号部分:
[a-z][a-z0-9!#$%&'*+/=?^_`{|}~-]*(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
测试你的示例文本「5579999644373paulosena91@hotmail.com」时,该正则只会匹配paulosena91@hotmail.com。
方案2:用负向后断言限制邮箱起始边界(兼容数字开头的邮箱)
如果需要支持数字开头的邮箱,可通过负向后断言确保邮箱的起始位置前面不是邮箱本地名允许的字符,避免把连在一起的手机号纳入匹配:
(?<![a-z0-9!#$%&'*+/=?^_`{|}~-])[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
这个规则会检查邮箱起始字符的前一位,若该字符属于邮箱本地名允许的字符(比如你的示例中paulosena91前的数字3),则不会从该位置开始匹配,只会找到真正独立的邮箱部分。
如果简历中邮箱通常和其他内容用空白分隔,也可以用更简单的(?<!\S)替代上述断言,限制邮箱必须从空白后的位置或字符串开头开始:
(?<!\S)[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
内容的提问来源于stack exchange,提问作者Paulo Sena
相关产品推荐
相关产品推荐

