【问题标题】:Regular Expression that needs to match three exact digits in a four digit number需要匹配四位数字中的三个精确数字的正则表达式
【发布时间】:2020-10-12 13:18:14
【问题描述】:

我试图创建的正则表达式应该匹配任何 4 位数字中包含三个“8”的所有数字。我拥有的正则表达式仅匹配 15 个数字列表中的前 10 个数字。任何建议将不胜感激。

\b[0-9]*(?:8[0-9]*[0-9]?8|8[0-9]*[0-9]?8|8[0-9]*[0-9]?8)\b

测试数据:

8088 8188 8288 8388 8488 8808 8818 8828 8838 8848 8880 8881 8882 8883 8884

最后五个数字也应该匹配,但不要匹配。

【问题讨论】:

  • 试试\b(?=(?:[0-79]*8){3}[0-79]*\b)\d{4}\b\b(?=\d{4}\b)(?:[0-79]*8){3}[0-79]*\b
  • \b(?=(?:\d*8){3})\d{4}\b
  • 直接的问题是你允许第一个数字是任何数字。
  • 它不需要修补 8888。Wiktor 解决方案完美运行。谢谢大家的帮助和解释。
  • 输入中可以有其他任意长度的数字吗?否则,请考虑删除“四位数字”要求,以明确问题。

标签: regex


【解决方案1】:

你可以使用

\b(?=\d{4}\b)(?:[0-79]*8){3}[0-79]*\b

请参阅regex demo

详情

  • \b - 单词边界
  • (?=\d{4}\b) - 右边必须有 4 位数字,并且后面应该有一个单词边界
  • (?:[0-79]*8){3} - 任何 0 位或更多位出现 3 次,但 88
  • [0-79]* - 除8 之外的任何 0 位或更多位数字
  • \b - 字边界。

【讨论】:

  • 与目前公认的至少更简洁易懂的解决方案相比,该解决方案有哪些优势?
  • @sindri_baldur 在this one does not meet 的要求下是正确的。
  • 我猜 OP 只考虑了 4 位数的输入。但普遍性肯定是好的。
  • 这是一个很好的答案,[0-79] 还可以防止不必要的回溯。 ++
【解决方案2】:

如果保证号码是四位的号码,那么您可以尝试以下方法:

\b8*[0-79]8*\b

要分析每个部分匹配的内容,您可以使用检查,

\b(8*)[0-79](8*)\b

【讨论】:

  • \b8*[0-79]8*\b 正则表达式 matches 848888888888488888 数字,而不仅仅是带有三个 8s 的 4 位数字。
【解决方案3】:

应该这样做。这将匹配 4 种模式中的任何一种。

([\d888]|[8\d88]|[88\d8]|[888\d])

您可能希望添加对分隔符的检查(在您的示例中为空格),因为此模式将匹配空格,从而为您提供更多结果

【讨论】:

【解决方案4】:

\b(\d?8{3}\d?)\b

  • 这使得单词绑定中的第一个和最后一个数字是可选的,使用 ?{0,1}
  • 将量词添加到您的八中以准确 你需要的八分之一{3}
  • [0-9] 替换为\d Digit for brewity
  • 假设您只有长度为 4 的数字。否则,请使用没有可选数字的替代方法:\b(\d8{3}|8{3}\d)\b

【讨论】:

  • 这只匹配相邻的 8:s。
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2011-08-10
相关资源
最近更新 更多