在尝试拨打电话号码之前,我需要确定该号码是否有效。这通话可以在世界各地进行。
哪种正则表达式可以匹配有效的国际电话号码?
在尝试拨打电话号码之前,我需要确定该号码是否有效。这通话可以在世界各地进行。
哪种正则表达式可以匹配有效的国际电话号码?
\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$
这是匹配通用国际电话号码的正确格式。我用标准国际访问代码标识符“+”替换了针对美国固定电话的国际访问代码011,并使其强制使用。我还将国内号码的最小位数更改为至少一位数字。
请注意,如果您以此格式输入号码到您的手机通讯录中,您可以成功地拨打通讯录中的任何号码,无论您在哪里旅行。对于固定电话,请将加号替换为您正在拨打的国家的国际访问代码。
请注意,这不考虑各国家/地区的国家号码计划规则 - 具体来说,它允许在可能不被国家号码计划允许的位置上出现零和一,并且对于某些国家,它允许号码长度超过国家号码计划(例如美国)。
^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
。 - SamWhan所有国家代码都由ITU定义。以下正则表达式基于ITU-T E.164和ITU操作公告第930号附录—2009年4月15日。它包含了所有现行国家代码以及未来预留的代码。虽然可以将其缩短一些,但我决定单独包括每个代码。
这是针对从美国起始的电话呼叫。对于其他国家,请用该国的拨号计划中适当的代码替换国际访问代码(正则表达式开头的011)。
此外,请注意ITU E.164定义了完整的国际电话号码的最大长度为15位数字。这意味着三位数字的国家代码会产生多达12位附加数字,而一位数字的国家代码可能包含多达14个附加数字。因此,
[0-9]{0,14}$
在正则表达式的末尾。
最重要的是,这个正则表达式并不意味着号码是有效的 - 每个国家都定义了自己的内部编号计划。这只能确保国家代码是有效的。
^011(999|998|997|996|995|994|993|992|991| 990|979|978|977|976|975|974|973|972|971|970| 969|968|967|966|965|964|963|962|961|960|899| 898|897|896|895|894|893|892|891|890|889|888| 887|886|885|884|883|882|881|880|879|878|877| 876|875|874|873|872|871|870|859|858|857|856| 855|854|853|852|851|850|839|838|837|836|835| 834|833|832|831|830|809|808|807|806|805|804| 803|802|801|800|699|698|697|696|695|694|693| 692|691|690|689|688|687|686|685|684|683|682| 681|680|679|678|677|676|675|674|673|672|671| 670|599|598|597|596|595|594|593|592|591|590| 509|508|507|506|505|504|503|502|501|500|429| 428|427|426|425|424|423|422|421|420|389|388| 387|386|385|384|383|382|381|380|379|378|377| 376|375|374|373|372|371|370|359|358|357|356| 355|354|353|352|351|350|299|298|297|296|295| 294|293|292|291|290|289|288|287|286|285|284| 283|282|281|280|269|268|267|266|265|264|263| 262|261|260|259|258|257|256|255|254|253|252| 251|250|249|248|247|246|245|244|243|242|241| 240|239|238|237|236|235|234|233|232|231|230| 229|228|227|226|225|224|223|222|221|220|219| 218|217|216|215|214|213|212|211|210|98|95|94| 93|92|91|90|86|84|82|81|66|65|64|63|62|61|60| 58|57|56|55|54|53|52|51|49|48|47|46|45|44|43| 41|40|39|36|34|33|32|31|30|27|20|7|1)[0-9]{0, 14}$
这是进一步的优化。
\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)
\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$
(i) 允许有效的国际前缀
(ii) 后跟9或10位数字,可以使用任何类型或放置分隔符(除了在最后两个数字之间)
这将匹配:
+1-234-567-8901
+61-234-567-89-01
+46-234 5678901
+1 (234) 56 89 901
+1 (234) 56-89 901
+46.234.567.8901
+1/234/567/8901
没有对那些出色答案的批评,我只是想提供我们管理内容创作者使用的简单解决方案:
^(\+|00)[1-9][0-9 \-\(\)\.]{7,32}$
必须以加号或两个零开头,并使用至少一点数字。空格、括号、减号和小数点都是可选的,不允许使用其他字符。
您可以安全地删除所有非数字(除了+号),并将其用于tel:
输入中。数字将具有通用的表示形式,我不必担心过于严格。
PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
String decodedNumber = null;
PhoneNumber number;
try {
number = phoneNumberUtil.parse(encodedHeader, null);
decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164);
} catch (NumberParseException e) {
e.printStackTrace();
}
修改了 @Eric 的正则表达式——增加了一个所有国家代码的列表(从 xxxdepy @ Github 获取)。
/(\+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{4,20}$/
/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/
优点:可以识别以 + 或 011 开头的号码,可以长度任意,而且处理多种扩展约定。(#、x、ext、extension)
这将适用于国际号码;
C#:
@"^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$"
JS:
/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/
^011(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{0,14}$
\d
替换为[0-9]
,如果您的正则表达式语法不支持\d
。对于,我找到了这个有用的内容:
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"