正则表达式匹配`99`而不是`!99`

时间:2016-03-20 21:48:34

标签: ruby regex

我的字符串是:"1 !2 3"。我需要匹配除!2之外的所有数字。我尝试了/\b\d{1,5}\b/,但仍匹配!2\b锚点适用于单词,但不适用于数字。

解决我问题的正则表达式是什么?

2 个答案:

答案 0 :(得分:4)

您需要一个负面的后置(?<!!)并使用\d+周围的单词边界(以排除2位数字上的部分匹配):

"1 !2 3".scan(/(?<!!)\b\d+\b/)

请参阅IDEONE demoregex demo here。如果您真的打算匹配包含1到5位数的数字,请将+量词(1次或更多次出现)替换为您的{1,5}限制量词。

如果数字前面带有感叹号,(?<!!)将无法匹配。单词边界需要在与\d+匹配的数字块的两侧使用非单词字符。由于!是一个非单词字符(即它属于[^A-Za-z0-9_]字符范围),如果您只使用单词边界,则允许它 - 这就是您的正则表达式不起作用的原因。添加lookbehind解决了这个问题。

答案 1 :(得分:2)

你可以使用一个没有外观的正则表达式:

r = /
    \s*!\d+\s* # match >= 0 spaces, an exclamation mark, > 0 digits, >= 0 spaces
    |          # or
    \s+        # match > 0 spaces
    /x         # free-spacing regex definition mode

"1 !2 3".split(r)
  #=> ["1", "3"]

或两个正则表达式:

"1 !2 3".gsub(/!\d+/, "").scan(/\d+/)
  #=> ["1", "3"]

或没有正则表达式:

"1 !2 3".split.reject { |s| s.start_with?("!") }
  #=> ["1", "3"]