正则表达式检查超过3次由非数字分隔的数字?

时间:2017-07-03 02:54:17

标签: ruby-on-rails ruby regex

你如何编写一个正则表达式,用于测试由非数字分隔的3个以上数字。

有效:

"abcd"
"abcd123abcd"
"123ab.cd"
"123a+bcd123xx999"
"8x8x8"

无效:

"8x8x8x8"
"123abcd123xx999x9"
"a9a9a9a9a"

3 个答案:

答案 0 :(得分:3)

在这里,我更喜欢使用简单的正则表达式和一些方法来使用单个相对复杂的正则表达式。

<强>代码

def no_more_than?(str, n)
  str.scan(/\d+/).size <= n
end

<强>实施例

arr =
  %w|abcd abcd123abcd 123ab.cd 123a+bcd123xx999 8x8x8 8x8x8x8 123abcd123xx999x9 a9a9a9a9a|

arr.each do |s|
  puts "#{s.ljust(25)}\#=> #{no_more_than?(s,3)}"
end

abcd                     #=> true
abcd123abcd              #=> true
123ab.cd                 #=> true
123a+bcd123xx999         #=> true
8x8x8                    #=> true
8x8x8x8                  #=> false
123abcd123xx999x9        #=> false
a9a9a9a9a                #=> false

另一种方法如下。

str.gsub(/\d+/).count <= 3

答案 1 :(得分:2)

你可以试试这个:

/^(\d{0,}\D{0,}){0,3}$/

答案 2 :(得分:0)

要测试的正则表达式,即找到超过3次出现的字符串

\d+(?:\D+\d+){3}

总数至少为:
4次出现的数字,由3个非数字分隔。

这就是你需要找到的所有东西,因为4是目标 即你不需要制作量词{3,},因为这是浪费时间。

您可以推断,如果匹配,则无效,因为您正在测试所有内容。