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


113

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

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


正規表現はアウトオブサービス番号のようなエラーをどのように処理しますか?他のエラーと同様に、無効な番号を呼び出して処理してみてください。

3
正規表現がこれを決定できないことは正しいですが、各発信試行は時間とリソースを消費します。番号に対して迅速な健全性チェックを行うことで、明らかに偽の呼び出しによって貴重なチャネルがブロックされることがなくなります。
Abtin Forouzandeh、2010年

1
LOL @ paxdiablo .... 1-800-CALL-HELPはRegExpテストに合格すると思います... lol
Buhake Sindi

1
以下の解決策のほとんどはいくつかの有効な数値(0030 210 12312312-有効なギリシャの電話番号はすべてのEU加盟国から呼び出されます)
ゼロクソイド2015

1
@JonHanna私はある点に同意しますが、一方で、UXの観点から、ユーザーが00XX ... Xの数値を入力した場合、テストに合格する必要があると思いませんか?ユーザー(つまり、高齢者)は、+が何であるか、テンキーや電話のキーパッドで+を入力する方法すら知らない場合があります。また、00XXXは有効な国際番号(つまり、ユーザーのコンテキスト)であり、+の代わりに終了コードが使用されていると主張することもできます。
Xeroxoid 2015

回答:


96
\+(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桁に変更しました。

この形式の番号を携帯電話のアドレス帳に入力すると、どこに旅行しても、アドレス帳のどの番号にも問題なく電話をかけることができます。固定電話の場合は、plusを、ダイヤル元の国の国際アクセスコードに置き換えます。

これは、国内番号計画の規則を考慮に入れていないことに注意してください。具体的には、国番号計画が許可しない場所でゼロと1を許可し、一部の国(たとえば、米国)の国内番号計画より長い番号の長さも許可します。


5
私には分別があるようです。これを使用します
セブンアース

17
これは無効です。ヨーロッパの電話番号は、先頭に+を付けずに2つの0で始めることができます。したがって、この正規表現(および他の回答でも同様)がサポートしていない0044 8984 1234と書かれていれば、+ 44 8984 1234(英国)などの電話番号も完全に有効です。
Xeroxoid 2015

4
@fezfoxの改善(?)と組み合わせて長さを最適化:^\+((?: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

1
+1。UXの観点からは、ええ00、前に置くことは理にかなっているかもしれません。開発と保守の観点から、すべての番号を最初から取得するか、取得するたびに+置き換えるように強制してもまったく問題ないと思います。特に、ほとんどの人が形式(ほとんどの国際電話の入力フィールド)を知っていることを考えるととにかく必要です)。加えて、それはワンライナーの修正であり、より読みやすくなっています。このアプローチにより、すべての電話番号が同じ形式であることが保証され、検証でエラーが発生しにくくなり、全体の保守が容易になります。00++
milosmns

1
また、EDGEより前(プレーンなGSM)のSMSの「昔」の時代では、を使用00するとメッセージが正しく送信されませんでした+が、aで始まると常に国際的に機能します。私たちは夢中になって、それを超複雑にすることができますが、時々、私たちの生活を楽にするためにいくつかの制約を
取り除く

66

すべての国コードはITUによって定義されています。次の正規表現は、ITU-T E.164およびITU運用速報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} $


12
ほとんど問題はありませんでした... "011"は国際コードの一部ではありません。これは、米国の人々が国際電話をかけるためにダイヤルする必要があるものです。そのプレフィックスは、どこからダイヤルするかによって変わります...そのプレフィックスは番号の一部ではありません。
ガブリエルマガナ2010年

3
@gmagana-私は私の答えでそれを言及します(段落2)
Abtin Forouzandeh 2010年

1
私のポイントは、それは電話番号の一部ではないということです。これは、「1」の米国国内長距離ダイヤルプレフィックスが電話番号の一部であると言うようなものです。
ガブリエルマガナ2010年

1
@gmagana-電話番号の一部ではないことは正しいですが、電話をかけるには技術的に必要です。
Abtin Forouzandeh、2010年

2
@Roger Pate:私はこれを理解するのに少し時間を費やし、他の人にも役立つことを願っています。私はまた、他の誰かがより良い解決策を持っていることを望んでいました(そのため、私は自分の回答を承認済みとしてマークしていません)。
Abtin Forouzandeh、2010年

32

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

\+(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
89901 +1(234)56-89 901
+46.234.567.8901
+1 / 234/567/8901


私はこれが古い答えであることを知っていますが、アメリカの番号に対して1をオプションにするオプションはありますか?
Adam Fratino、2016

あなたがやりたいことは、(i)「+」をオプションにし、(ii)国際コードをオプションにすることです。「?」を配置します +の後と最初の閉じ括弧の後。
fezfox 16

@ManosPasgiannisは、「9桁または10桁が後に続く」と指定されているとおり、そうです。8を使用するキプロスで表示されるため、\ d \ W *のインスタンスを1つ削除して最後のシーケンスを調整し、最後の式(\ d {1,3})を作成します
fezfox

22

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

2
それは良い解決策かもしれませんが、このライブラリを使用する前に、電話番号をチェックするだけで大​​量のjsをインポートする必要があります ... libphonenumber.jsはクロージャライブラリを必要とするためです...それは軽い解決策ではありません:/
J. BizMai

11

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

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

11

私はこれを使います:

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

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


これは、ほとんどの国際電話番号形式にかなり近いものです。
feeela

9

これが正規表現の「最適化された」バージョンです。

^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



6

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

魅力のように機能します。オランダの電話番号も同様です。ありがとう!
mauvm

2

これまでに与えられたさまざまな答えのすべてによって証明されるように、これを行う方法は明らかにたくさんありますが、ここに$ 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

これらの素晴らしい答えについての批判はありません。私が管理コンテンツの作成者に使用する簡単なソリューションを提示したいだけです。

^(\+|00)[1-9][0-9 \-\(\)\.]{7,}$

プラスまたは2つのゼロから強制的に開始し、少なくとも少しの数字、空白、中括弧、マイナス、およびポイントを使用します。その他の文字は使用できません。安全にすべての非数値を削除し、これをtel:入力で使用できます。数値には共通の表現形式があり、制限的であることを心配する必要はありません。


1

ヨーロッパの数字のシンプルなバージョンで、0034617393211のような数字だけでなく、004401484172842のような長い数字にも一致します。

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

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


1
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
このコードスニペットは質問に答えることがありますが、その方法や理由を説明するコンテキストは提供していません。答えを説明するために、1〜2文を追加することを検討してください。
brandonscript 2016年

1

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

  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

私はこれを以下で使用しました:

^(\+|00)[0-9]{1,3}[0-9]{4,14}(?:x.+)?$

+ CCC.NNNNNNNNNNxEEEEまたは00CCC.NNNNNNNNNNxEEEEの形式

国際電話の場合、電話番号は「+」または「00」で始まる必要があります。ここで、Cは1から3桁の国コードです。

Nは最大14桁です。

Eは(オプションの)拡張です。

先頭のプラス記号と国コードに続くドットが必要です。リテラル「x」文字は、拡張子が提供されている場合にのみ必要です。



0

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

ITU E.164の番号付けに基づいて正規表現を作成する場合は、これを更新します。


0

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

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


0

これは私にとっては機能しますが、00、001、0011などの接頭辞がありません:

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



0

私はヨーロッパの電話番号の正規表現を作成しましたが、これはダイヤルプレフィックスと番号の長さに対して固有です。

const PhoneEuropeRegExp = () => {
    // eu phones map https://en.wikipedia.org/wiki/Telephone_numbers_in_Europe
    const phonesMap = {
        "43": [4, 13],
        "32": [8, 10],
        "359": [7, 9],
        "385": [8, 9],
        "357": 8,
        "420": 9,
        "45": 8,
        "372": 7,
        "358": [5, 12],
        "33": 9,
        "350": 8,
        "49": [3, 12],
        "30": 10,
        "36": [8, 9],
        "354": [7, 9],
        "353": [7, 9],
        "39": [6, 12],
        "371": 8,
        "423": [7, 12],
        "370": 8,
        "352": 8,
        "356": 8,
        "31": 9,
        "47": [4, 12],
        "48": 9,
        "351": 9,
        "40": 9,
        "421": 9,
        "386": 8,
        "34": 9,
        "46": [6, 9],
    };
    const regExpBuilt = Object.keys(phonesMap)
        .reduce(function(prev, key) {
            const val = phonesMap[key];
            if (Array.isArray(val)) {
                prev.push("(\\+" + key + `[0-9]\{${val[0]},${val[1]}\})`);
            } else {
                prev.push("(\\+" + key + `[0-9]\{${val}\})`);
            }
            return prev;
        }, [])
        .join("|");
    return new RegExp(`^(${regExpBuilt})$`);
};

alert(PhoneEuropeRegExp().test("+420123456789"))

-4

これを試してください。12を超える電話番号があるかどうかはわかりません。

^(00|\+){1}\d{12}$

1
これは、国コードを含む正確に 12桁の数字と一致します。それは世界中の長さのばらつきを考慮に入れていないため、それは誤りです。さらに、最大長は実際には15桁です。
tmt

1
@tmtそれではどう^(00|\+){1}\d{12,15}$ですか?
18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.