2017-07-03 408 views
0

我试图用正则表达式的参数使用match方法来根据定义选择一个有效的电话号码,任何字符串与九个数字。简单的正则表达式 - 忽略某些字符

例如:

  • 9347584987是有效的,
  • (456)322-3456是有效的,
  • (324)5688890是有效的。

  • (340)的HelloWorld无效,
  • 456748无效。

到目前为止,我能够使用\d{9}连续选择的9个字符的字符串的话,但我不知道如何具体忽略任何字符,如“-”或''或''在序列的中间。

我可以在这里使用什么样的正则表达式?

+1

尝试https://regex101.com/。检查右下方的面板:“快速参考” –

+0

最简单的方法是事先删除标点字符。 – melpomene

回答

-1

图样:(Rubular Demo

^\(?\d{3}\)?\d{3}-?\d{4}$ # this makes the expected symbols optional 

这种模式将确保在字符串的开始处的开口(之后是3个数字的闭合)

^(\(\d{3}\)|\d{3})\d{3}-?\d{4}$ 

原则上,虽然,我与墨尔波墨涅同意建议您删除所有非数字字符,测试的9个字符长度,然后存储/处理的电话号码在单/可靠/基本格式。

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 
0

我建议使用一个正则表达式为每个有效的模式,而不是构建一个单一的正则表达式。测试和调试会更容易,并且更容易维护代码。例如,如果"123-456-7890"123-456-7890 x231"将来被视为有效数字,则只需为以下数组中的每一个添加单个简单正则表达式。

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

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 
+0

感谢您使用此代码段,这可能会提供一些即时帮助。通过说明为什么这是一个很好的解决问题的办法,一个适当的解释会[大大提高](https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)其教育价值,并会使其对未来具有相似但不相同问题的读者更有用。请编辑您的答案以添加解释,并指出适用的限制和假设。 – basvk