我想从一个字符串中捕获三个子字符串,其中必须包含这三个子字符串模式:
- 生日(所有数字均采用 yyyymmdd 格式)
- 身份证号码(以字符开头,后跟数字)
- 全名
如果三个子串模式都不可用,则返回不匹配。
图案样本:
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
使用上面的模式,我可以成功获取生日和身份证号码,而不是全名。该模式仅捕获全名的最后一个单词。
对此有何建议?
谢谢。
最佳答案
问题显然是因为 greediness在 (?=.*((?:\b[a-z]+\b\s*)+))
中。您可以通过在 .*
之后放置 ?
来使吃掉所需单词的 .*
变得懒惰。我还建议重构该部分以获得更高的准确性:
^(?=.*?\b([a-z]{1,2}\d+)\b)(?=.*?\b(\d+)\b)(?=.*?\b([a-z]+(?:\h+[a-z]+)*)\b).+
- 进一步使所有
.*
变得惰性.*?
(也是为了更好的性能) - 添加了
^
anchor ,仅在开始时触发前瞻
关于php - 正则表达式:如果字符串包含特定模式则捕获句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318251/