【问题标题】:Regex to find numbers excluding four digit numbers正则表达式查找不包括四位数字的数字
【发布时间】:2012-01-17 18:14:04
【问题描述】:

我试图弄清楚如何找到不是年份的数字(我将年份定义为简单的四位数宽的数字。)

比如我想去接

1

12

123

但不是 1234 以避免日期(4 位数)。

如果正则表达式也选择了12345,那很好,但不是解决此问题所必需的

(注意:这些要求可能看起来很奇怪。它们是我坚持的更大解决方案的一部分)

【问题讨论】:

  • 您想使用什么语言?抱歉重复。
  • 抱歉 - 我应该澄清一下:它是一个用 vb .net 和 c#.net 编写的高级系统。我没有看过代码,但它可能很旧:System.Text.RegularExpressions

标签: regex regex-negation


【解决方案1】:

如果lookbehind 和lookahead 可用,以下应该可以工作:

(?<!\d)(\d{1,3}|\d{5,})(?!\d)

解释:

(?<!\d)            # Previous character is not a digit
(\d{1,3}|\d{5,})   # Between 1 and 3, or 5 or more digits, place in group 1
(?!\d)             # Next character is not a digit

如果您不能使用环视,以下应该可以工作:

\b(\d{1,3}|\d{5,})\b

解释:

\b                 # Word boundary
(\d{1,3}|\d{5,})   # Between 1 and 3, or 5 or more digits, place in group 1
\b                 # Word boundary

Python 示例:

>>> regex = re.compile(r'(?<!\d)(\d{1,3}|\d{5,})(?!\d)')
>>> regex.findall('1 22 333 4444 55555 1234 56789')
['1', '22', '333', '55555', '56789']

【讨论】:

  • 不错!但是...您的环视正则表达式在以下输入中错过了 22 和 666666:1 22 333 4444 55555 666666 7777777
  • @MikeClark - 是的,这有点棘手,这就是为什么环视更可取的原因。如果您只是在没有边界检查的情况下执行(\d{1,3}|\d{5,}),您最终会得到更糟糕的结果,将数字分成中间。
  • 将第二个正则表达式切换为使用似乎效果更好的单词边界,现在唯一的区别是第二个在字母和数字混合时无法匹配,'a333' 将匹配第一个正则表达式但不匹配第二个。
  • 我和你的第一个一起去了(后面看)。
  • @jJack - 很高兴它起作用了,您可以通过单击我的答案旁边的复选标记的轮廓将accept it 作为最佳解决方案。
【解决方案2】:

根据您使用的正则表达式风格,这可能适合您:

(([0-9]{1,3})|([0-9]{5,}))

【讨论】:

    【解决方案3】:

    (\\d{0,4} | \\d{6,}) 在 java 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      相关资源
      最近更新 更多