我试图用正则表达式的参数使用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