簡體   English   中英

使用正則表達式從字符串中提取電話號碼?

[英]Extract phone numbers from string using regex?

我需要從rails中的大字符串中提取一些電話號碼。 這些號碼將以多種格式出現,並且可以在一個字符串中包含多個電話號碼。

以下是發生的格式類型的示例:

  • 022 1234567
  • 021 123 2345
  • 0271233211
  • 021-233-9123
  • 09 123 32112
  • 021 2331231或021 321123123

提取出現在文本正文中的電話號碼的最有效方法是什么?

更新:謝謝你的答案。 在對其中一些進行測試后,我意識到我應該包含更多示例。 以下列表中未顯示以下內容:

  • 622 32281
  • 5754321
  • 092213212
  • (09)1234321

我會保持簡單:

\d{2}[\s\d-]+

兩個數字,一個或多個空格,數字或連字符。

需要更多字符:

\d{2}[\s\d-]{5,}

(兩個數字和5個或更多的空格,連字符的數量),這將減少錯誤命中的數量。

這些將包括電話號碼后面的額外空格,但結果可能會被修剪。

但是,我會刪除連字符和空格,並計算剩余的數字,以將它們識別為電話號碼,而不是修剪。

如果電話號碼始終以0開頭:

0\d[\s\d-]{5,}\d

這以一個數字結束,因此在前面的示例中最后刪除了空格。

添加以下進一步的示例:

\b[\s()\d-]{6,}\d\b

這是我如何去做的:

LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.".split
STRING = [
  '123 123 1234',
  LOREM_IPSUM.shift(1 + rand(4)),
  '123-123-1234',
  LOREM_IPSUM.shift(1 + rand(4)),
  '12 123 12345',
  LOREM_IPSUM.shift(1 + rand(4)),
  '123 1234567',
  LOREM_IPSUM.shift(1 + rand(4)),
  '123 123456789',
  LOREM_IPSUM.shift(1 + rand(4)),
  '123 12345',
  LOREM_IPSUM.shift(1 + rand(4)),
  '1234567',
  LOREM_IPSUM.shift(1 + rand(4)),
  '1234567890',
  LOREM_IPSUM.shift(1 + rand(4)),
  '123456789',
  LOREM_IPSUM.shift(1 + rand(4)),
  '(12)1234567',
].join(' ')

STRING # => "123 123 1234 Lorem ipsum dolor sit 123-123-1234 amet, consectetur adipisicing 12 123 12345 elit, sed do eiusmod 123 1234567 tempor 123 123456789 incididunt ut 123 12345 labore 1234567 et dolore magna aliqua. 1234567890 Ut enim ad minim 123456789 veniam, (12)1234567"
STRING.scan(/\d+.\d+.\d+/) # => ["123 123 1234", "123-123-1234", "12 123 12345", "123 1234567", "123 123456789", "123 12345", "1234567", "1234567890", "123456789", "12)1234567"]
STRING.scan(/\d+.\d+.\d+/).map{ |s| s.gsub(/\D+/, '') } # => ["1231231234", "1231231234", "1212312345", "1231234567", "123123456789", "12312345", "1234567", "1234567890", "123456789", "121234567"]

我刪除了幾個重復的格式以簡化測試。

可以通過多種方式格式化電話號碼。 用於電話號碼驗證的全面正則表達式 ”是一個很好的創意起點。 根據所選答案中的評論:

只刪除輸入中的所有非數字字符(“x”除外)

我認為這是一個合理的起始模式:

/\d+.\d+.\d+/

使用scan測試字符串可以捕獲上面的所有示例電話號碼。 一旦你有他們,請遵循該答案中的下一條建議:

[...]然后當您顯示時,重新格式化您的心靈內容。

我會用這個

\\b(\\d{2}[\\s|\\-|\\d]{2}\\d{2}[\\s|\\d][\\s|\\-|\\d]\\d{2,5})\\b

我寫了這個((\\+\\d+\\s*|00\\d+\\s*|0\\d+\\s*)(\\(\\d+\\)\\s*|\\d+\\s*)?(\\d{2,10}(\\-|\\/|\\s)*){3,8})\\b只要數字以+ a 000開頭就可以正常工作,這是為了避免剝離其他非電話數字組。

識別電話號碼的一般問題非常棘手。 但是根據上面的例子,如何:

/\d{2,3}[\s-]?\d{3}[\s-]?\d{4,}/

兩位或三位數,可選空格或短划線,三位數,可選空格或短划線,四位或更多位數。

我很驚訝在任何人的回答中都沒有看到任何7個。 除了最后一個之外,這里有一個將會完整的:

/(?=(?:\d[ -]*){7,})([\d -]*)/

也許你可以先刪掉()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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