[英]Simple regex - ignoring certain characters
我正在嘗試將match
方法與正則表達式的參數一起使用,以選擇有效的電話號碼(根據定義),以選擇任何具有九位數字的字符串。
例如:
但
到目前為止,我已經可以使用\\d{9}
選擇連續的9位字符的示例字符串,但是我不確定如何具體忽略任何字符,例如' - '或' ( '或序列中間的' ) '。
我在這里可以使用哪種正則表達式?
鑒於:
nums=['9347584987','(456)322-3456','(324)5688890','(340)HelloWorld', '456748 is NOT valid']
您可以分割一個NON位數然后重新加入以刪除非位數:
> 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"]
或者,您可以使用正則表達式獲取數字和通用定界符來獲取看起來像“ phony numbery”的一組數字:
> 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
與
> '123 is NOT a valid area code for 456-7890'.split(/\D/).join
=> "1234567890" # match
我建議為每個有效模式使用一個正則表達式,而不要構造一個正則表達式。 測試和調試會更容易,代碼也更容易維護。 例如,如果將來將"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
字串#match? 在Ruby v2.4中首次亮相。 有很多選擇,包括str.match(r)
和str =~ r
str.match(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
圖樣:( 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個字符的長度,然后以一種/可靠/基本的格式存儲/處理電話號碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.