正则表达式匹配电话字符串中的位数?

时间:2014-10-22 20:51:39

标签: regex angularjs angularjs-directive

尝试将最小4位数,最多16位数的正则表达式放在一起,这些数字可以用字符分隔:() - x +(但不应该是最小/最大计数的一部分)。

即。 " 555-123-4567"会回归真实," 1-234"是的," +44(55)123-3333"是的," abcd1"是假的," 1 - () - 4 ++++ - () - 6"是假的。

纯粹正则表达式的任何方式吗?尝试几个表达但不工作。

3 个答案:

答案 0 :(得分:2)

你需要做的是匹配任意数量的允许字符,后跟一个数字,后跟任意数量的允许字符,并在4和16次之间匹配相同的序列。

像这样

^([()\- x+]*\d[()\- x+]*){4,16}$

http://rubular.com/r/6VhALkFPQZ

答案 1 :(得分:2)

此:

/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/

适用于以下格式:

123-456-7890 (123)456-7890 1234567890 123.456.7890

答案 2 :(得分:2)

TL; DR

OP已经接受了正则表达式解决方案。下面我介绍一种查看问题的另一种方法。希望它有助于OP,但它真正更多地针对未来的访客和的粉丝。

不要使用Regexps

验证逻辑

正则表达式最适合匹配或提取模式,而不是复杂的数据验证。例如,OP提供以下规则:

  

尝试将最小4位数,最多16位数的正则表达式放在一起,这些数字可以用字符分隔:() - x +(但不应该是最小/最大计数的一部分)。

然后说1-()-4++++4-()-66应该是假的。但是,它符合OP最初定义的真理规则。 (注意:这个例子后来在OP的问题中有所改变,但我提出的观点仍然有效。)

示例:使用代码简化正则表达式模式匹配

逻辑应该封装在简短,可测试的代码片段中,而不是复杂的正则表达式中。例如,请考虑以下Ruby代码:

numbers = [
  '555-123-4567',
  '1-234',
  '+44(55)123-3333',
  'abcd1',
  '1-()-4++++4-()-66'
]   

numbers.map { |num| num.delete '- x+()' }.grep /\A\d{4,16}\z/
#=> ["5551234567", "1234", "44551233333", "14466"]

即使你不是Rubyist,代码应该很容易理解。这段代码删除了与我们的匹配无关的字符,然后检查每个字符串是否只包含4-16位数字,而这些数字锚定在字符串的开头和结尾。您现在只是验证一个简单的模式(例如所有数字)而不是验证复杂的模式,并且定义的间隔从4到16。此外,您可以将这种逻辑分解为更小的步骤而不是简单的调用长方法链,使其本身更容易测试。

示例:完全避免正则表达式验证

您甚至可以通过避免任何类型的验证的正则表达式,并使您的布尔表达式更明确。请考虑以下事项:

numbers = [
  '555-123-4567',
  '1-234',
  '+44(55)123-3333',
  'abcd1',
  '1-()-4++++4-()-66'
]

numbers.map do |num|
  digits = num.scan /\d/
  valid = digits.count >= 4 and digits.count <= 16
  puts "#{num}: #{valid}"
end

这将打印:

555-123-4567: true
1-234: true
+44(55)123-3333: true
abcd1: false
1-()-4++++4-()-66: true

对我而言,这似乎是一种更加强大和灵活的方式来解决电话号码验证问题。这个问题,在这里以一种或另一种形式在Stack Overflow中被提出并具有惊人的规律性。您的里程可能会有所不同。