re = /(\n|\s)(?:(?:\+?(\d{1}|\d{2}|\d{3})\s*)\s*(?:\(\s*(\d{1}|\d{2}|\d{3})\s*\)|(\d{1,3}))\s*\-?(?:\(\s*(\d{1,3})\s*\)|(\d{3}))\s*\-?(?:\d{2}\s*\-?\d{2}))/m
str = '
+79996364778 rus
8 (918) 373-6633 rus
+1 650-798-2800 usa
8(949)373-66-55 rus
+7 (961) 859-56-19 rus
+1 205-635-1136 usa
+22(909)333 4334
+7(985)5310868
+79855310868
88008454545
+55 11 99999-5555 Brazil
+593 7 282-3889 Ecuador
(+44) 0848 9123 456 UK
+1 284 852 5500 BVI
+1 345 9490088 Grand Cayman
+32 2 702-9200 Belgium
+65 6511 9266 Asia Pacific
+86 21 2230 1000 Shanghai
+9124 4723300 India
+821012345678 South Korea
And for your extension pleasure
+55 11 99999-5555 ramal 123 Brazil
+55 11 99999-5555 foo786544 Brazil
(?!\\b(0)\\1+\\b)(\\+?\\d{1,3})\\s?\\(?\\d{3}\\)?\\s?([. -]?)\\d{3}\\3\\d{4}'
# Print the match result
str.scan(re) do |match|
puts match.to_s
end
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html