正则表达式:如果字符串包含特定模式,则捕获句子

3

我希望从一个字符串中捕获三个子字符串,这些子字符串必须包含以下三个模式:

  1. 生日(所有数字都是yyyymmdd格式)
  2. ID号码(以字符开头,后跟数字)
  3. 全名

如果这三个子字符串模式不可用,则返回无匹配项。

模式示例:

XD079523 ALFRED ROMEO 19830311
ALFRED BETA GAMMA 19830311 AD929523
BETA FERNANDEZ AS079523 19830311
19830311 BETA MAX  AS079523
KK079523 19830311 ANGEL MARINA VINES
19830121 BX079523 VINCENT EVERHART

我已经尝试了以下正则表达式:
/(?=.*\b([a-z]{1,2}\d+)\b)(?=.*\b(\d+)\b)(?=.*((?:\b[a-z]+\b\s*)+)).+/mi

测试:https://regex101.com/r/iypQuC/1

使用上述模式,我可以成功捕获生日和身份证号码,但不是姓名的全名。该模式只会捕获全名中的最后一个单词。

对此有什么建议吗?

谢谢。

1个回答

4

显然问题出在(?=.*((?:\b[a-z]+\b\s*)+))中的贪婪性。您可以通过在它后面加上?来使吞掉所需单词的.*变得懒惰。我还建议重构该部分以获得更好的准确性:

^(?=.*?\b([a-z]{1,2}\d+)\b)(?=.*?\b(\d+)\b)(?=.*?\b([a-z]+(?:\h+[a-z]+)*)\b).+
  • 进一步将所有的 .* 改为惰性匹配 .*? (也是为了更好的性能)
  • 添加了 ^ 锚点,仅在开头触发先行断言

请查看更新后的regex101演示


谢谢。我确实需要重新学习"贪婪度"。 - RYT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接