如何修改正则表达式提取邮件签名中指定类型的单行电话号码
解决方案
问题1:强制号码在同一行匹配
原正则中的[\s.-]会匹配换行符(\s包含换行、空格、制表符等),导致跨换行拼接内容。只需将所有\s替换为仅匹配空格和制表符的[ \t],即可避免跨行匹配:
修复后的基础号码正则:
(?<![%_])\b(\+?\d{1,}[ \t.-]?\(?\d{1,}\)?[ \t.-]?\(?\d{1,}\)?[ \t.-]?\d{1,}[ \t.-]?\d{1,}[ \t.-]?\d{3,})
修改后,正则只会在同一行内匹配连续的号码格式,不会把上一行的末尾数字(如邮编19073)和下一行的号码错误拼接。
问题2:按号码类型提取(以Mobile/Cell为例)
针对带前缀的号码,需要先匹配各种大小写、格式的前缀,再捕获后续号码。使用(?i)开启忽略大小写模式,覆盖所有前缀变体:
匹配Mobile/Cell号码的正则:
(?i)(?:\(?M\)?[: ]|Mobile[: ]|Cell[: ])\s*(?<![%_])\b(\+?\d{1,}[ \t.-]?\(?\d{1,}\)?[ \t.-]?\(?\d{1,}\)?[ \t.-]?\d{1,}[ \t.-]?\d{1,}[ \t.-]?\d{3,})
前缀部分说明:
(?i):忽略大小写,匹配M/m、Mobile/mobile、Cell/cell等格式\(?M\)?:匹配带或不带括号的单字母前缀,如M、(M)[: ]:匹配前缀后的冒号或空格,支持M:、M、(M):等格式\s*:匹配前缀与号码之间的任意空白(包括无空白的情况,如M:360.123.1471)
适配其他类型(如Fax/Office)
只需修改前缀部分即可,比如匹配Fax的正则:
(?i)(?:\(?F\)?[: ]|Fax[: ])\s*(?<![%_])\b(\+?\d{1,}[ \t.-]?\(?\d{1,}\)?[ \t.-]?\(?\d{1,}\)?[ \t.-]?\d{1,}[ \t.-]?\d{1,}[ \t.-]?\d{3,})
内容的提问来源于stack exchange,提问作者sagi
相关产品推荐
相关产品推荐

