各种格式的电话号码数据(我选择这些数据是因为进入的数据不可靠,而不是预期的格式):
+1 480-874-4666 404-581-4000 (805) 682-4726 978-851-7321, Ext 2606 413- 658-1100 (513) 287-7000,Toll Free (800) 733-2077 1 (813) 274-8130 212-363-3200,Media Relations: 212-668-2251. 323/221-2164我的Ruby代码提取所有数字,删除美国国家代码的任何前导1,然后使用前10位数字创建所需格式的“新”电话号码:
nums = phone_number_string.scan(/[0-9]+/) if nums.size > 0 all_nums = nums.join all_nums = all_nums[0..0] == "1" ? all_nums[1..-1] : all_nums if all_nums.size >= 10 ten_nums = all_nums[0..9] final_phone = "#{ten_nums[0..2]}-#{ten_nums[3..5]}-#{ten_nums[6..9]}" else final_phone = "" end puts "#{final_phone}" else puts "No number to fix." end结果非常好 !
480-874-4666 404-581-4000 805-682-4726 978-851-7321 413-658-1100 513-287-7000 813-274-8130 212-363-3200 323-221-2164但是,我认为还有更好的办法。 你可以重构这个更高效,更清晰或更有用吗?
Phone number data in various formats (I've chosen these because the data coming in is unreliable and not in expected formats):
+1 480-874-4666 404-581-4000 (805) 682-4726 978-851-7321, Ext 2606 413- 658-1100 (513) 287-7000,Toll Free (800) 733-2077 1 (813) 274-8130 212-363-3200,Media Relations: 212-668-2251. 323/221-2164My Ruby code to extract all the digits, remove any leading 1's for the USA country code, then use the first 10 digits to create the "new" phone number in a format desired:
nums = phone_number_string.scan(/[0-9]+/) if nums.size > 0 all_nums = nums.join all_nums = all_nums[0..0] == "1" ? all_nums[1..-1] : all_nums if all_nums.size >= 10 ten_nums = all_nums[0..9] final_phone = "#{ten_nums[0..2]}-#{ten_nums[3..5]}-#{ten_nums[6..9]}" else final_phone = "" end puts "#{final_phone}" else puts "No number to fix." endThe results are very good!
480-874-4666 404-581-4000 805-682-4726 978-851-7321 413-658-1100 513-287-7000 813-274-8130 212-363-3200 323-221-2164But, I think there's a better way. Can you refactor this to be more efficient, more legible, or more useful?
最满意答案
这是一个简单的方法,只使用正则表达式和替换:
def extract_phone_number(input) if input.gsub(/\D/, "").match(/^1?(\d{3})(\d{3})(\d{4})/) [$1, $2, $3].join("-") end end(\d{3})(\d{3})(\d{4})所有非数字( \D ) (\d{3})(\d{3})(\d{4}) )和格式。
这是测试:
test_data = { "+1 480-874-4666" => "480-874-4666", "404-581-4000" => "404-581-4000", "(805) 682-4726" => "805-682-4726", "978-851-7321, Ext 2606" => "978-851-7321", "413- 658-1100" => "413-658-1100", "(513) 287-7000,Toll Free (800) 733-2077" => "513-287-7000", "1 (813) 274-8130" => "813-274-8130", "212-363-3200,Media Relations: 212-668-2251." => "212-363-3200", "323/221-2164" => "323-221-2164", "" => nil, "foobar" => nil, "1234567" => nil, } test_data.each do |input, expected_output| extracted = extract_phone_number(input) print "FAIL (expected #{expected_output}): " unless extracted == expected_output puts extracted endHere's a much simpler approach using only regexes and substitution:
def extract_phone_number(input) if input.gsub(/\D/, "").match(/^1?(\d{3})(\d{3})(\d{4})/) [$1, $2, $3].join("-") end endThis strips all non-digits (\D), skips an optional leading one (^1?), then extracts the first remaining 10 digits in chunks ((\d{3})(\d{3})(\d{4})) and formats.
Here's the test:
test_data = { "+1 480-874-4666" => "480-874-4666", "404-581-4000" => "404-581-4000", "(805) 682-4726" => "805-682-4726", "978-851-7321, Ext 2606" => "978-851-7321", "413- 658-1100" => "413-658-1100", "(513) 287-7000,Toll Free (800) 733-2077" => "513-287-7000", "1 (813) 274-8130" => "813-274-8130", "212-363-3200,Media Relations: 212-668-2251." => "212-363-3200", "323/221-2164" => "323-221-2164", "" => nil, "foobar" => nil, "1234567" => nil, } test_data.each do |input, expected_output| extracted = extract_phone_number(input) print "FAIL (expected #{expected_output}): " unless extracted == expected_output puts extracted end更多推荐
发布评论