web-dev-qa-db-ja.com

有効な国際電話番号と一致する正規表現は何ですか?

電話番号をダイヤルする前に、その電話番号が有効かどうかを判断する必要があります。電話は世界のどこにでも行くことができます。

有効な国際電話番号と一致する正規表現は何ですか?

92
\+(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を許可し、一部の国(米国など)の国内番号計画よりも長い番号の長さも許可します。

78
Eric

すべての国コードはITUで定義されています。次の正規表現は、ITU-T E.164および ITU運用速報No. 930の付録– 15.IV.2009 に基づいています。現在の国コードと将来の使用のために予約されているコードがすべて含まれています。少し短縮できますが、各コードを個別に含めることにしました。

これは、米国から発信されたコール用です。その他の国については、国際アクセスコード(正規表現の先頭にある011)をその国の ダイヤルプラン に適したものに置き換えます。

また、ITU E.164では、完全な国際電話番号の最大長が15桁に定義されていることに注意してください。つまり、3桁の国コードでは最大12桁、1桁の国コードでは最大14桁を追加できます。従って

[0-9]{0,14}$

a正規表現の終わり。

最も重要なことは、この正規表現は番号が有効であることを意味するものではありません。各国が独自の内部番号計画を定義しています。これは、国コードが有効であることのみを保証します。

^ 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 | 2 26 | 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} $

65

これはさらなる最適化です。

\+(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

29
fezfox

Googleのライブラリ libphonenumber を使用できます。

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();
    }
20
Paulo Fidalgo

私はこれを使用します:

/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/

利点:+または011の始まりを認識し、必要なだけ長くすることができ、多くの拡張規則を処理します。 (#、x、ext、extension)

11
TOBlender

これは国際電話番号で機能します。

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}$/
10
MADol

正規表現の「最適化された」バージョンは次のとおりです。

^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]sを\dに置き換えることができます。

9

iOS Swiftに役立つ

let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
7
Zaid Pathan

@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}$/
4
Dev

これまでに行われたさまざまな回答のすべてから明らかなように、明らかにこれを行う方法は多数ありますが、ここに$ 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 +)$

2
trekinaz

以下は、次の最も一般的な電話番号シナリオの正規表現です。これは、市外局番の米国の観点から調整されていますが、国際的なシナリオで機能します。

  1. 実際の数字は10桁のみです。
  2. 米国番号の場合、市外局番は括弧()で囲むことができます。
  3. 国コードの長さは1〜3桁です。オプションで、+記号を前に付けることができます。
  4. 国コード、市外局番、および残りの番号の間には、ダッシュ、スペース、ドット、またはスペースなしがあります。
  5. 有効な電話番号をすべてゼロにすることはできません。

    ^(?!\b(0)\1+\b)(\+?\d{1,3}[. -]?)?\(?\d{3}\)?([. -]?)\d{3}\3\d{4}$
    

説明:

    ^ - start of expression  
    (?!\b(0)\1+\b) - (?!)Negative Look ahead. \b - Word boundary around a '0' character. \1 backtrack to previous capturing group (zero). Basically don't match all zeros.  
    (\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[. -]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional.  
    \(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code.  
    ([. -]?) - optional space, dash or dot
    $ - end of expression

その他の例と説明- https://regex101.com/r/hTH8Ct/2/

1
Appy
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();
}
1
Cássio

0034617393211のような数字だけでなく、004401484172842のような長い数字にも一致する、ヨーロッパの数字の単純なバージョン。

^0{2}[0-9]{11,}

それが役に立てば幸い :・)

1
Roc Boronat

この正規表現は、インド、カナダ、ヨーロッパ、ニュージーランド、オーストラリア、米国の電話番号と国コードに対応しています。

"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"

0
Harsha Garg

国際番号計画は、ITU E.164 番号計画に基づいています。これが正規表現の出発点だと思います。

ITU E.164の番号付けに基づいて正規表現を作成するようになったら、これを更新します。

0
Buhake Sindi

これは実際にRegExpを使って仕事を終わらせていない-またはおそらくそのため-これは私にとって素晴らしい解決策のように見えます: https://intl-tel-input.com/node_modules/intl-tel -input/examples/gen/is-valid-number.html

0
Tony Vlcek

これを試してください、それは私のために動作します。

^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
0

これは、00、001、0011などの接頭辞なしでも機能します:

/^\+*(\d{3})*[0-9,\-]{8,}/
0
redwud

電話番号の検証には、次のAPIを試してください。また、これは国、地域、プロバイダーを返します

デモ https://libphonenumber.appspot.com/

git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.

0
Gagan Ahuja