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