ダイヤルする前に、電話番号が有効かどうかを判断する必要があります。電話は世界中のどこにでも行くことができます。
有効な国際電話番号と一致する正規表現は?
\+(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 を、標準の国際アクセス コード識別子「+」に置き換えて、必須にしました。また、国番号の最小値を 1 桁以上に変更しました。
携帯電話のアドレス帳にこの形式の番号を入力すると、旅行先に関係なく、アドレス帳のどの番号にも正常に電話をかけることができることに注意してください。固定電話の場合は、プラスをダイヤルしている国の国際アクセス コードに置き換えます。
これは国内の番号計画の規則を考慮していないことに注意してください。具体的には、国内の番号計画では許可されていない可能性のある場所でゼロと 1 を許可し、一部の国 (米国など) では国内の番号計画よりも長い番号の長さを許可しています。
すべての国コードは ITU によって定義されています。次の正規表現は、ITU-T E.164 およびITU Operational Bulletin No. 930 – 15.IV.2009 の付属書に基づいています。現在の国コードと、将来の使用のために予約されているコードがすべて含まれています。少し短くすることもできますが、各コードを個別に含めることにしました。
これは、米国からの通話用です。他の国の場合は、国際アクセス コード (正規表現の先頭にある 011) をその国のダイヤル プランに適したものに置き換えます。
また、ITU E.164 では、完全な国際電話番号の最大長が 15 桁に定義されていることに注意してください。つまり、3 桁の国コードには最大 12 桁が追加され、1 桁の国コードには最大 14 桁の追加数字が含まれる可能性があります。従って
[0-9]{0,14}$
正規表現の終わり。
最も重要なことは、この正規表現は番号が有効であることを意味するものではありません。各国は独自の内部番号計画を定義しています。これは、国コードが有効であることのみを保証します。
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 桁の数字、任意のタイプまたは区切り記号の配置 (最後の 2 桁の間を除く) を許可します。
これは一致します:
+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
@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、拡張子、拡張子)
これは国際電話番号で機能します。
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}$
正規表現構文がをサポートしていない場合は、 \dsをに置き換えることができます。[0-9]\d
For iOS SWIFT I found this helpful,
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
これまでに提供されたさまざまな回答のすべてから明らかなように、これを行うには明らかに多くの方法がありますが、ここに 0.02 ドルの価値を投入し、以下の正規表現を提供します。これは、上記のほぼすべてよりも少し簡潔です。 、しかし、ほとんどのものよりも徹底的です。また、国コードを $1 に、ローカル番号を $2 に残すという素晴らしい副作用もあります。
^\+(?=\d{5,15}$)(1|2[078]|3[0-469]|4[013-9]|5[1-8]|6[0-6] |7|8[1-469]|9[0-58]|[2-9]..)(\d+)$
public static boolean validateInternationalPhoneNumberFormat(String phone) {
StringBuilder sb = new StringBuilder(200);
// Country code
sb.append("^(\\+{1}[\\d]{1,3})?");
// Area code, with or without parentheses
sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?");
// Phone number separator can be "-", "." or " "
// Minimum of 5 digits (for fixed line phones in Solomon Islands)
sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?");
// 4 more optional digits
sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$");
return Pattern.compile(sb.toString()).matcher(phone).find();
}
電話番号の検証には、次の API を試してください。また、これは国、地域、およびプロバイダーを返します
デモ https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0
0034617393211 のような数字だけでなく、004401484172842 のような長い数字にも一致するヨーロッパの数字のシンプルなバージョン。
^0{2}[0-9]{11,}
それが役に立てば幸い :・)
国際番号計画は、ITU E.164番号計画に基づいています。それが正規表現の出発点だと思います。
ITU E.164 番号付けに基づいて正規表現を作成することができたら、これを更新します。
これを試してみてください。12 より長い電話番号があるかどうかはわかりません。
^(00|\+){1}\d{12}$