我的字符串是:"1 !2 3"
。我需要匹配除!2
之外的所有数字。我尝试了/\b\d{1,5}\b/
,但仍匹配!2
。 \b
锚点适用于单词,但不适用于数字。
解决我问题的正则表达式是什么?
答案 0 :(得分:4)
您需要一个负面的后置(?<!!)
并使用\d+
周围的单词边界(以排除2位数字上的部分匹配):
"1 !2 3".scan(/(?<!!)\b\d+\b/)
请参阅IDEONE demo和regex 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"]