使用正则表达式检查最少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 aheadchecks 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