【问题标题】:Best match REGEXP pattern最佳匹配 REGEXP 模式
【发布时间】:2017-12-06 08:10:02
【问题描述】:

我需要查找字符串中可能出现的 3 种格式(A = 字母;# = 数字):

A###A
A####
A#####

例子:

This booking has the ID of A#####.

字符串只能包含三个示例模式之一。我用 OR 运算符编写了这个 REGEXP,所以我可以检查并提取我需要的 ID:

([a-zA-Z]\d{4})|([a-zA-Z]\d{3}[a-zA-Z])|([a-zA-Z]\d{5})

问题是,它不会返回来自 REGEXP 的最佳匹配,而是第一个匹配。例如,如果字符串包含A#####,它将返回A####,忽略最后一个数字——因为它之前已经匹配了一个模式。

我错过了什么? 提前致谢!

【问题讨论】:

  • ([a-zA-Z]\d{5}) 作为第一选择。或使用[a-zA-Z]\d{4,5}|[a-zA-Z]\d{3}[a-zA-Z]。如果需要,请加上单词边界,\b(?:[a-zA-Z]\d{4,5}|[a-zA-Z]\d{3}[a-zA-Z])\b
  • 应该是有序的,最长的匹配在前。
  • pff,我应该考虑一下订单...谢谢:)

标签: php regex


【解决方案1】:
\b[a-zA-Z]\d{3}(?:[a-zA-Z]|\d{1,2})\b

[a-zA-Z]\d{3} - 常量部分

([a-zA-Z]|\d{1,2}) - 字母,一位或两位数

demo

【讨论】:

    【解决方案2】:

    您可以在匹配 4 个字符之前检查匹配的 5 个字符。 这样,它总是会在检测到 4 之前检测到 5。 你可以直接切换 5 和 4。

    ([a-zA-Z]\d{5})|([a-zA-Z]\d{4})|([a-zA-Z]\d{3}[a-zA-Z])
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多