尝试将最小4位数,最多16位数的正则表达式放在一起,这些数字可以用字符分隔:() - x +(但不应该是最小/最大计数的一部分)。
即。 " 555-123-4567"会回归真实," 1-234"是的," +44(55)123-3333"是的," abcd1"是假的," 1 - () - 4 ++++ - () - 6"是假的。
纯粹正则表达式的任何方式吗?尝试几个表达但不工作。
答案 0 :(得分:2)
你需要做的是匹配任意数量的允许字符,后跟一个数字,后跟任意数量的允许字符,并在4和16次之间匹配相同的序列。
像这样^([()\- x+]*\d[()\- x+]*){4,16}$
答案 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)
OP已经接受了正则表达式解决方案。下面我介绍一种查看问题的另一种方法。希望它有助于OP,但它真正更多地针对未来的访客和regex的粉丝。
正则表达式最适合匹配或提取模式,而不是复杂的数据验证。例如,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中被提出并具有惊人的规律性。您的里程可能会有所不同。