2017-07-03 86 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