如何编写正则匹配句首单词时排除Mr./Dr.后的姓名?
句首单词匹配正则修改方案
现有规则与问题
当前已实现的正则匹配规则分为两类:
- 匹配段落开头的首个单词、双引号后出现的句首单词
- 匹配句点加空格后首字母大写的单词
现存误匹配问题:跟在Mr.、Dr.这类尊称后的姓名(如Sherwood)满足「句点加空格后首字母大写」的匹配条件,会被错误命中,这类词汇不属于需要匹配的句首单词范畴。
当前使用的原始正则代码:
((^[A-Z]+[a-z]*[A-Z]*[a-z]*|(?<=")[A-Z]+[a-z]*[A-Z]*[a-z]*)|(?<=\.\s)[A-Z]+[a-z]*[A-Z]*[a-z]*)
修改方法
误匹配的核心原因是原有规则中(?<=\.\s)的正向回顾断言没有排除句点属于尊称的场景,只需要在该断言前增加固定长度的负向回顾断言,排除句点前紧邻Mr/Dr的情况即可,修改后的完整正则如下:
((^[A-Z]+[a-z]*[A-Z]*[a-z]*|(?<=")[A-Z]+[a-z]*[A-Z]*[a-z]*)|(?<!\bMr\.)(?<!\bDr\.)(?<=\.\s)[A-Z]+[a-z]*[A-Z]*[a-z]*)
规则说明
- 新增的
(?<!\bMr\.)、(?<!\bDr\.)负向断言会在匹配.后大写单词前做校验:如果当前句点是Mr./Dr.这类尊称的结尾,就跳过本次匹配,不会命中后面跟着的姓名 - 所有断言均为固定长度,兼容绝大多数主流正则引擎
- 如果后续需要新增其他同类排除项(如
Ms.、Prof.),只需要按照相同格式追加对应负向回顾断言即可 - 调试时可以优先校验尊称后跟姓名的误匹配场景是否被过滤,再验证段落开头、引号后、正常句尾句点后三类合法场景的匹配是否正常
内容的提问来源于stack exchange,提问作者south662
相关产品推荐
相关产品推荐

