我試圖用正則表達式的參數使用match
方法來根據定義選擇一個有效的電話號碼,任何字符串與九個數字。簡單的正則表達式 - 忽略某些字符
例如:
- 9347584987是有效的,
- (456)322-3456是有效的,
- (324)5688890是有效的。
但
- (340)的HelloWorld無效,
- 456748無效。
到目前爲止,我能夠使用\d{9}
連續選擇的9個字符的字符串的話,但我不知道如何具體忽略任何字符,如「-」或'('或')'在序列的中間。
我可以在這裏使用什麼樣的正則表達式?
我試圖用正則表達式的參數使用match
方法來根據定義選擇一個有效的電話號碼,任何字符串與九個數字。簡單的正則表達式 - 忽略某些字符
例如:
但
到目前爲止,我能夠使用\d{9}
連續選擇的9個字符的字符串的話,但我不知道如何具體忽略任何字符,如「-」或'('或')'在序列的中間。
我可以在這裏使用什麼樣的正則表達式?
圖樣:(Rubular Demo)
^\(?\d{3}\)?\d{3}-?\d{4}$ # this makes the expected symbols optional
這種模式將確保在字符串的開始處的開口(
之後是3個數字的閉合)
。
^(\(\d{3}\)|\d{3})\d{3}-?\d{4}$
原則上,雖然,我與墨爾波墨涅同意建議您刪除所有非數字字符,測試的9個字符長度,然後存儲/處理的電話號碼在單/可靠/基本格式。
考慮:
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
我建議使用一個正則表達式爲每個有效的模式,而不是構建一個單一的正則表達式。測試和調試會更容易,並且更容易維護代碼。例如,如果"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
。
"9347584987" =~ /(?:\d.*){9}/ #=> 0
"(456)322-3456" =~ /(?:\d.*){9}/ #=> 1
"(324)5688890" =~ /(?:\d.*){9}/ #=> 1
"(340)HelloWorld" =~ /(?:\d.*){9}/ #=> nil
"456748" =~ /(?:\d.*){9}/ #=> nil
感謝您使用此代碼段,這可能會提供一些即時幫助。通過說明爲什麼這是一個很好的解決問題的辦法,一個適當的解釋會[大大提高](https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)其教育價值,並會使其對未來具有相似但不相同問題的讀者更有用。請編輯您的答案以添加解釋,並指出適用的限制和假設。 – basvk
嘗試https://regex101.com/。檢查右下方的面板:「快速參考」 –
最簡單的方法是事先刪除標點字符。 – melpomene