3

我的正则表达式如下:

     /^(\d|-|\(|\)|\+|\s){12,}$/

这将允许数字 (, ) 和空格。但我想确保字符串包含至少 8 位数字。一些允许的字符串如下:

      (1323  ++24)233
      24243434 43
      ++++43435++4554345  434

它不应该允许这样的字符串:

     ((((((1213)))
     ++++232+++
4

3 回答 3

7

一开始在您的正则表达式中使用Look ahead..

/^(?=(.*\d){8,})[\d\(\)\s+-]{8,}$/
  ---------------
          |
          |->this would check for 8 or more digits

(?=(.*\d){8,})是0zero width look aheadchecks多个字符 (ie .*) 后跟一个数字 (ie \d) 8 到很多次 (ie {8,0})

(?=)被称为零宽度,因为它不消耗字符..它只是检查


要将其限制为 14 位数,您可以这样做

/^(?=([^\d]*\d){8,14}[^\d]*$)[\d\(\)\s+-]{8,}$/

在这里试试

于 2012-11-28T07:55:01.000 回答
0

无需提及^,$或 , or 的“或更多”部分{8,}{12,}不清楚它的来源。

以下使意图变得透明。

r = /
  (?=(?:.*\d){8})    # First condition: Eight digits
  (?!.*[^-\d()+\s])  # Second condition: Characters other than `[-\d()+\s]` should not be included.
/x

导致:

"(1323  ++24)233" =~ r #=> 0
"24243434 43" =~ r #=> 0
"++++43435++4554345  434" =~ r #=> 0
"((((((1213)))" =~ r #=> nil
"++++232+++" =~ r #=> nil
于 2012-11-28T08:19:33.327 回答
0

这是一个非正则表达式解决方案

numbers = ["(1323  ++24)233", "24243434 43" , "++++43435++4554345  434", "123 456_7"]

numbers.each do |number|
  count = 0
  number.each_char do |char| 
    count += 1 if char.to_i.to_s == char
    break if count > 7
  end
  puts "#{count > 7}"
end
于 2012-11-28T08:50:42.460 回答