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

标签 php regex

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

  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

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

对此有何建议?

谢谢。

最佳答案

问题显然是因为 greediness(?=.*((?:\b[a-z]+\b\s*)+)) 中。您可以通过在 .* 之后放置 ? 来使吃掉所需单词的 .* 变得懒惰。我还建议重构该部分以获得更高的准确性:

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

See your updated demo at regex101

关于php - 正则表达式:如果字符串包含特定模式则捕获句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318251/

相关文章:

python - CountVectorizer、scikit-learn 中的标记模式

字符串 "M0.89"的 C++ 正则表达式

java - 替换大括号内的所有内容?

php - 计算总条目数并在 Laravel 中制作一个数字列表

javascript - 如何使用 REGEX 匹配和不匹配子字符串

php - 如何使用 PHP 管理动态创建表单中的数据

php - ffmpeg php 使系统无响应

javascript - 从字符串中删除多余的 <br>

regex - Mac 上的批量重命名文件正则表达式

php - 如何计算php文件中javascript的行数?