簡體   English   中英

RegEx用於規范英國電話號碼

[英]RegEx for normalising UK telephone number

我正在嘗試將英國電話號碼標准化為國際格式。

以下字符串應解析為:+447834012345

  • 07834012345
  • +447834012345
  • +4407834012345
  • +44(0)7834 012345
  • +44 0 7834 012345
  • 004407834012345
  • 0044(0)7834012345
  • 00 44 0 7834012345

到目前為止,我已經知道了:

"+44" + mobile.replaceAll("[^0-9]0*(44)?0*", "")

這還不能完全解決,因為我在以0開頭等方面遇到問題; 見下表。 如果可能,我想嘗試避免使用全局標志。

Mobile              | Normalised         | 
--------------------+--------------------+------
07834012345         | +4407834012345     | FAIL
+447834012345       | +447834012345      | PASS
+4407834012345      | +447834012345      | PASS
+44 (0) 7834 012345 | +44783412345       | FAIL
+44 0 7834 012345   | +44783412345       | FAIL
004407834012345     | +44004407834012345 | FAIL
0044 (0) 7834012345 | +4400447834012345  | FAIL
00 44 0 7834012345  | +44007834012345    | FAIL
+4407834004445      | +447834004445      | PASS

謝謝

如果您仍然想要正則表達式,我可以使它像這樣運行:

"+44" + System.out.println(replaceAll("[^0-9]", "")
  .replaceAll("^0{0,2}(44){0,2}0{0,1}(\\d{10})", "$2"));

編輯:更改代碼以反映失敗的測試。 在運行正則表達式之前刪除了非數字字符。

編輯:基於注釋更新代碼。

像我在這里的答案一樣,我也建議您查看Google libphonenumber庫。 我知道它不是正則表達式,但它確實可以滿足您的要求。

文檔中的示例如下所示(使用其他語言提供):

假設您有一個代表瑞士電話號碼的字符串。 這是將其解析/標准化為PhoneNumber對象的方式:

 String swissNumberStr = "044 668 18 00"; PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); try { PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH"); } catch (NumberParseException e) { System.err.println("NumberParseException was thrown: " + e.toString()); } 

此時,swissNumberProto包含:

 { "country_code": 41, "national_number": 446681800 } 

PhoneNumber是從phonenumber.proto自動生成的類,並進行了必要的修改以提高效率。 有關每個字段含義的詳細信息,請參閱https://github.com/googlei18n/libphonenumber/blob/master/resources/phonenumber.proto

現在讓我們驗證數字是否有效:

 boolean isValid = phoneUtil.isValidNumber(swissNumberProto); // returns true 

格式化方法支持幾種格式,如下所示:

 // Produces "+41 44 668 18 00" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL)); // Produces "044 668 18 00" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL)); // Produces "+41446681800" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164)); 

暫無
暫無

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

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