【问题标题】:Regex to capture 2 consecutive digits, but don't capture if 3 or more正则表达式捕获 2 个连续数字,但如果 3 个或更多则不捕获
【发布时间】:2020-02-13 12:53:09
【问题描述】:

例如。 如果我有 1234X03.04

我想捕获0304 但我不想要122334

我明白了:

  • 负前瞻:(?!...)
  • 负面的后视:(?<!...)

但是,我不知道如何将它组合成一个正则表达式。 有人可以帮我吗?干杯。

【问题讨论】:

  • 干得好。谢谢。如果你把它作为答案,我会接受。 (猴宙斯)
  • 你能更好地描述规则吗?是否允许在没有正则表达式的情况下执行此操作?只是纯Java?您是否要捕获 x 之后的数字,但前提是最多存在 2 个数字?
  • 我不太关心 Java 方面 - 可以映射它 - 只要它在 regex101.com 上运行,我就可以处理其余的。

标签: java regex


【解决方案1】:

你可以使用:

(?<!\d)\d{2}(?!\d)
  • (?&lt;!\d) - 前一个字符不是数字
  • \d{2} - 正好是两个连续的数字
  • (?!\d) - 下一个字符不是数字

这是一个demo 的 PHP 结果。我认为 PHP 的正则表达式接近 Java 的。

【讨论】:

  • 这对尾随 .04 有效吗? end of the line 是否被正则表达式的最后一部分覆盖?
  • @f1sh 我提供了一个演示。
  • 注意:RegexPlanet 有 Java 方言,但 PHP 在大多数情况下应该没问题
  • 我本来打算找(?&lt;=^|\D)\d\d(?=\D|$),但提供的答案只需更少的步骤就可以正常工作。
  • @RenatoBack 在编程中实现相同目标的方法总是不止一种 :)
【解决方案2】:

你需要什么(?&lt;=\D|\b)\d{2}(?=\D|\b)

(?&lt;=\D|\b)\) - 在我们的表达式之前不是数字或单词边界,但不包括在匹配中。

\d{2} - 我们的表达式,只有两位数,包括在匹配中。

(?=\D|\b) - 在我们的表达式之后不是数字或单词边界,但不包括在匹配中。

【讨论】:

  • 你能解释一下正则表达式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多