【问题标题】:Regex: capture sentence if string contains certain patterns正则表达式:如果字符串包含某些模式,则捕获句子
【发布时间】:2017-05-10 03:38:08
【问题描述】:

我想从一个字符串中捕获三个子字符串,其中必须包含这三个子字符串模式:

  1. 生日(所有数字均为 yyyymmdd 格式)
  2. 身份证号(以字符开头,后跟数字)
  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

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

对此有什么建议吗?

谢谢。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    问题显然是因为(?=.*((?:\b[a-z]+\b\s*)+)) 中的greediness。你可以在 .* 后面加上 ? 来使你想要的单词变得懒惰。我还建议重构该部分以获得更高的准确性:

    ^(?=.*?\b([a-z]{1,2}\d+)\b)(?=.*?\b(\d+)\b)(?=.*?\b([a-z]+(?:\h+[a-z]+)*)\b).+
    
    • 进一步使所有.* 变得懒惰.*?(也为了更好的性能)
    • 添加了 ^ 锚点,仅在开始时触发前瞻

    See your updated demo at regex101

    【讨论】:

    • 谢谢。我确实需要重新学习“贪婪”。
    猜你喜欢
    • 2011-05-05
    • 2020-08-25
    • 2016-12-15
    • 2012-02-19
    • 2021-10-23
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多