我正在尝试将match
方法与正则表达式的参数一起使用,根据定义,选择一个有九位数的字符串的有效电话号码。
例如:
但是
到目前为止,我可以使用\d{9}
来连续选择9位字符的示例字符串,但我不确定如何明确忽略任何字符,例如' - 在序列中间'或'('或')。
我可以在这里使用什么样的正则表达式?
答案 0 :(得分:0)
假设:
nums=['9347584987','(456)322-3456','(324)5688890','(340)HelloWorld', '456748 is NOT valid']
您可以拆分非数字并重新加入以删除非数字:
> nums.map {|s| s.split(/\D/).join}
["9347584987", "4563223456", "3245688890", "340", "456748"]
然后过滤长度:
> nums.map {|s| s.split(/\D/).join}.select {|s| s.length==10}
["9347584987", "4563223456", "3245688890"]
或者,您可以通过使用正则表达式来抓取数字和常用分隔符来获取一组看起来“虚假数字”的数字:
> nums.map {|s| s[/[\d\-()]+/]}
["9347584987", "(456)322-3456", "(324)5688890", "(340)", "456748"]
然后按上述方式处理该列表。
这将描绘:
> '123 is NOT a valid area code for 456-7890'[/[\d\-()]+/]
=> "123" # no match
VS
> '123 is NOT a valid area code for 456-7890'.split(/\D/).join
=> "1234567890" # match
答案 1 :(得分:0)
我建议为每个有效模式使用一个正则表达式,而不是构造单个正则表达式。它更容易测试和调试,并且更容易维护代码。例如,如果"123-456-7890"
或123-456-7890 x231"
以后被视为有效数字,则只需为每个数组VALID_PATTERS
添加一个简单的正则表达式。
VALID_PATTERS = [/\A\d{10}\z/, /\A\(\d{3}\)\d{3}-\d{4}\z/, /\A\(\d{3}\)\d{7}\z/]
def valid?(str)
VALID_PATTERS.any? { |r| str.match?(r) }
end
ph_nbrs = %w| 9347584987 (456)322-3456 (324)5688890 (340)HelloWorld 456748 |
ph_nbrs.each { |s| puts "#{s.ljust(15)} \#=> #{valid?(s)}" }
9347584987 #=> true
(456)322-3456 #=> true
(324)5688890 #=> true
(340)HelloWorld #=> false
456748 #=> false
String#match?在Ruby v2.4中首次亮相。有许多替代方案,包括str.match(r)
和str =~ r
。
答案 2 :(得分:0)
"9347584987" =~ /(?:\d.*){9}/ #=> 0
"(456)322-3456" =~ /(?:\d.*){9}/ #=> 1
"(324)5688890" =~ /(?:\d.*){9}/ #=> 1
"(340)HelloWorld" =~ /(?:\d.*){9}/ #=> nil
"456748" =~ /(?:\d.*){9}/ #=> nil
答案 3 :(得分:-1)
模式:(Rubular Demo)
^\(?\d{3}\)?\d{3}-?\d{4}$ # this makes the expected symbols optional
此模式将确保字符串开头的开头(
后跟3个数字,即结束)
。
^(\(\d{3}\)|\d{3})\d{3}-?\d{4}$
原则上,我同意melpomene建议您删除所有非数字字符,测试9个字符长度,然后以单个/可靠/基本格式存储/处理电话号码。