如何用正则正向前瞻与反向引用移除文本中重复未知名称?
正则匹配重复未知名称的问题解决
现有正则与问题
当前使用的正则表达式:
((\S(?!\.|por |, | se | que ).)*(Inc|LLC).((?!\.|por |, | se | que ).)*|\d?\D*\d{4}\D?\d{4})(?=.*?\1)
目标是匹配文本中重复出现的未知名称(这类名称通常像页眉、页脚或标题一样多次出现),但存在以下问题:
- 无法匹配所有重复项(例如测试文本的最后一行未被匹配)
- 需遵守规则:仅出现一次的“名称”不匹配,包含
.、por 、, 、 se 、 que的片段也不匹配,且必须仅用正则实现。
问题分析
现有正则仅覆盖了两类重复内容:带Inc/LLC的企业名称、含两组4位数字的卡号类字符串,但遗漏了不含上述特征的普通多词重复名称,这就是部分重复项未被匹配的核心原因。
改进后的正则表达式
((?:(?!\.|por |, | se | que ).)*(Inc|LLC)(?:(?!\.|por |, | se | que ).)*|\d?\D*\d{4}\D?\d{4}|(?:(?!\.|por |, | se | que )\S+(?:\s+(?!\.|por |, | se | que )\S+)+))(?=.*?\1)
正则说明
- 第一分支:匹配包含
Inc/LLC且全程不包含被排除词的企业名称 - 第二分支:匹配含两组4位数字的卡号类字符串(兼容前后可能的非数字字符)
- 第三分支:匹配由多个不含被排除词的单词组成的普通名称(至少两个单词,减少单字重复的误匹配)
- 末尾
(?=.*?\1)保证匹配的内容在后续文本中重复出现
内容的提问来源于stack exchange,提问作者Rafael Tan
相关产品推荐
相关产品推荐

