我的正则表达式如下:
/^(\d|-|\(|\)|\+|\s){12,}$/
这将允许数字 (, ) 和空格。但我想确保字符串包含至少 8 位数字。一些允许的字符串如下:
(1323 ++24)233
24243434 43
++++43435++4554345 434
它不应该允许这样的字符串:
((((((1213)))
++++232+++
一开始在您的正则表达式中使用Look ahead
..
/^(?=(.*\d){8,})[\d\(\)\s+-]{8,}$/
---------------
|
|->this would check for 8 or more digits
(?=(.*\d){8,})
是0zero width look ahead
到checks
多个字符 (ie .*
) 后跟一个数字 (ie \d
) 8 到很多次 (ie {8,0}
)
(?=)
被称为零宽度,因为它不消耗字符..它只是检查
要将其限制为 14 位数,您可以这样做
/^(?=([^\d]*\d){8,14}[^\d]*$)[\d\(\)\s+-]{8,}$/
在这里试试
无需提及^
,$
或 , 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
这是一个非正则表达式解决方案
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