簡體   English   中英

簡單的正則表達式-忽略某些字符

[英]Simple regex - ignoring certain characters

我正在嘗試將match方法與正則表達式的參數一起使用,以選擇有效的電話號碼(根據定義),以選擇任何具有九位數字的字符串。

例如:

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

  • (340)HelloWorld無效,並且
  • 456748無效。

到目前為止,我已經可以使用\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM