Welcher reguläre Ausdruck passt zu gültigen internationalen Telefonnummern?


113

Ich muss feststellen, ob eine Telefonnummer gültig ist, bevor ich versuche, sie zu wählen. Der Anruf kann überall auf der Welt getätigt werden.

Welcher reguläre Ausdruck passt zu gültigen internationalen Telefonnummern?


Wie geht ein regulärer Ausdruck mit Fehlern wie Außer-Dienst-Nummern um? Versuchen Sie einfach anzurufen und behandeln Sie die ungültige Nummer wie andere Fehler.

3
Während Sie richtig sind, dass der Regex dies nicht bestimmen kann, verbraucht jeder ausgehende Versuch Zeit und Ressourcen. Durch eine schnelle Überprüfung der Nummer wird sichergestellt, dass ein offensichtlich gefälschter Anruf einen wertvollen Kanal nicht blockiert.
Abtin Forouzandeh

1
LOL @ paxdiablo .... Ich denke, 1-800-CALL-HELP wird Ihren RegExp-Test bestehen ... lol
Buhake Sindi

1
In dieser Frage ist nicht klar, ob die Nummern gültig sein müssen, wenn sie aus den USA oder einem anderen Land der Welt angerufen werden, da die meisten der folgenden Lösungen einige gültige Nummern nicht validieren (z. B. 0030 210 12312312 - eine gültige Nummer Griechische Nummer aus einem EU-Land
angerufen

1
@ JonHanna Ich stimme einem Punkt zu, aber denken Sie aus UX-Sicht nicht, dass der Test bestehen sollte, wenn ein Benutzer eine 00XX ... X-Nummer eingibt? Es gibt Fälle, in denen Benutzer (dh ältere Menschen) nicht einmal wissen, was das + ist und wie es auf einer Ziffern- / Telefontastatur eingegeben werden kann. Ich könnte auch immer noch argumentieren, dass 00XXX eine gültige internationale Nummer ist (dh im Kontext eines Benutzers), bei der anstelle des + der Exit-Code verwendet wurde.
Xeroxoid

Antworten:


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

Ist das richtige Format für den Abgleich einer generischen internationalen Telefonnummer. Ich habe den US-Festnetz-zentrierten internationalen Zugangscode 011 durch den Standard-internationalen Zugangscode-Bezeichner '+' ersetzt, sodass er obligatorisch ist. Ich habe auch das Minimum für die nationale Nummer auf mindestens eine Ziffer geändert.

Beachten Sie, dass Sie, wenn Sie Nummern in diesem Format in Ihr Handy-Adressbuch eingeben, möglicherweise erfolgreich eine beliebige Nummer in Ihrem Adressbuch anrufen, unabhängig davon, wohin Sie reisen. Ersetzen Sie bei Festnetzanschlüssen das Pluszeichen durch den internationalen Zugangscode für das Land, aus dem Sie wählen.

Beachten Sie, dass dies NICHT die Regeln des nationalen Nummernplans berücksichtigt - insbesondere erlaubt es Nullen und Einsen an Orten, die in nationalen Nummernplänen möglicherweise nicht zulässig sind, und erlaubt auch Nummernlängen, die größer sind als der nationale Nummernplan für einige Länder (z. B. die USA).


5
Scheint mir vernünftig. Ich werde dieses verwenden
Sevenearths

17
Dies ist nicht gültig. Europäische Telefonnummern können am Anfang mit einer doppelten 0 ohne + beginnen. Daher ist eine Telefonnummer wie: +44 8984 1234 (UK) auch dann vollkommen gültig, wenn 0044 8984 1234 geschrieben ist, die dieser reguläre Ausdruck (und auch bei anderen Antworten) nicht unterstützt.
Xeroxoid

4
Kombiniert mit @ fezfox Verbesserungen (?) Und Länge optimiert:^\+((?: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. Aus UX-Sicht könnte es sinnvoll sein, 00vorne zuzulassen . Unter dem Gesichtspunkt der Entwicklung und Wartung würde ich sagen, dass es vollkommen in Ordnung ist, alle Nummern zu erzwingen +, um sie 00bei +jedem Erhalt zu beginnen oder sogar durch sie zu ersetzen - insbesondere angesichts der Tatsache, dass die meisten Menschen das +Format kennen (welche die meisten internationalen Telefoneingabefelder) erfordern sowieso). Außerdem ist es ein Einzeiler-Fix und viel besser lesbar. Dieser Ansatz würde auch sicherstellen, dass alle Telefonnummern im gleichen Format vorliegen, und Ihre Validierung weniger fehleranfällig machen, wodurch das Ganze wartbarer wird.
Milosmns

1
In den "alten" Tagen der Pre-EDGE-SMS (einfaches GSM) 00würde die Verwendung der Nachricht nicht korrekt gesendet, während das Beginnen mit a +immer international funktionieren würde. Wir können verrückt werden und es super komplex machen, aber manchmal ist es möglich / wert, ein paar Einschränkungen fallen zu lassen, um unser Leben leichter zu machen :)
Milosmns

66

Alle Ländercodes werden von der ITU definiert. Der folgende reguläre Ausdruck basiert auf ITU-T E.164 und dem Anhang zum ITU Operational Bulletin Nr. 930 - 15.IV.2009 . Es enthält alle aktuellen Ländercodes und Codes, die für die zukünftige Verwendung reserviert sind. Obwohl es etwas verkürzt werden könnte, habe ich beschlossen, jeden Code unabhängig einzuschließen.

Dies gilt für Anrufe aus den USA. Für andere Länder ersetzen den internationalen Zugangscode (die 011 am Anfang der Regex) mit dem, was für dieses Land angemessen ist Wählplan .

Beachten Sie außerdem, dass ITU E.164 die maximale Länge einer vollständigen internationalen Telefonnummer auf 15 Stellen definiert. Dies bedeutet, dass ein dreistelliger Ländercode bis zu 12 zusätzliche Ziffern ergibt und ein einstelliger Ländercode bis zu 14 zusätzliche Ziffern enthalten kann. Daher die

[0-9]{0,14}$

a das Ende der Regex.

Vor allem bedeutet diese Regex nicht, dass die Nummer gültig ist - jedes Land definiert seinen eigenen internen Nummerierungsplan. Dies stellt nur sicher, dass der Ländercode gültig ist.

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
Hatte es fast richtig gemacht ... "011" ist nicht Teil eines internationalen Codes. Es ist genau das, was Menschen in den USA wählen müssen, um einen internationalen Anruf zu tätigen. Dieses Präfix ändert sich je nachdem, von wo aus Sie wählen ... Dieses Präfix ist also NICHT Teil der Nummer.
Gabriel Magana

3
@gmagana - Ich erwähne das in meiner Antwort (Absatz 2)
Abtin Forouzandeh

1
Mein Punkt ist, dass es nicht Teil der Telefonnummer ist. Das ist so, als würde man sagen, dass das US-amerikanische Fernwahlpräfix "1" Teil der Telefonnummer ist.
Gabriel Magana

1
@gmagana - obwohl Sie Recht haben, dass es nicht Teil der Telefonnummer ist, ist es technisch erforderlich, den Anruf zu tätigen.
Abtin Forouzandeh

2
@ Roger Pate: Ich habe ein bisschen Zeit damit verbracht, dies herauszufinden, und ich hoffe, dass es für andere nützlich sein wird. Ich hoffte auch, dass jemand anderes eine bessere Lösung haben könnte (weshalb ich meine eigene Antwort nicht als akzeptiert markiert habe).
Abtin Forouzandeh

32

Dies ist eine weitere Optimierung.

\+(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) erlaubt gültige internationale Präfixe
(ii) gefolgt von 9 oder 10 Ziffern mit jeder Art oder Platzierung von Begrenzern (außer zwischen den letzten beiden Ziffern)

Dies entspricht:
+ 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


Ich weiß, dass dies eine alte Antwort ist, aber gibt es eine Option, um die 1 für amerikanische Zahlen optional zu machen?
Adam Fratino

Was Sie tun möchten, ist (i) das "+" optional und (ii) den internationalen Code optional zu machen. Also platzieren Sie "?" nach dem + und nach dem ersten Schließen der Klammer.
Fezfox

@ManosPasgiannis gut ja, wie angegeben "gefolgt von 9 oder 10 Ziffern". Es würde in Zypern erscheinen, wenn Sie 8 verwenden. Passen Sie also einfach die letzte Sequenz an, indem Sie eine Instanz von \ d \ W * entfernen und den letzten Ausdruck (\ d {1,3})
fezfox

22

Sie können die Bibliothek libphonenumber von Google verwenden.

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
Es könnte eine gute Lösung sein, aber nur um Telefonnummern zu überprüfen, müssen Sie vor der Verwendung dieser Bibliothek eine große Menge von js importieren ... da libphonenumber.js eine Abschlussbibliothek benötigt ... es ist keine leichte Lösung: /
J. BizMai

11

Dies wird für internationale Nummern funktionieren;

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

Ich benutze dieses:

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

Vorteile: Erkennt + oder 011 Anfänge, lässt sie so lange wie nötig sein und behandelt viele Erweiterungskonventionen. (#, x, ext, Erweiterung)


Dieser kommt den meisten internationalen Telefonnummernformaten ziemlich nahe.
Feeela

9

Hier ist eine "optimierte" Version Ihres regulären Ausdrucks:

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

Sie können das \ds durch ersetzen, [0-9]wenn Ihre Regex-Syntax dies nicht unterstützt \d.



6

Modifizierter @ Erics regulärer Ausdruck - Liste aller Ländercodes hinzugefügt (von xxxdepy @ Github erhalten . Ich hoffe, Sie finden ihn hilfreich:

/(\+|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}$/

Klappt wunderbar. Auch für niederländische Telefonnummern. Vielen Dank!
Mauvm

2

Es gibt offensichtlich eine Vielzahl von Möglichkeiten, dies zu tun, wie aus all den unterschiedlichen Antworten hervorgeht, die bisher gegeben wurden, aber ich werde meinen Wert von 0,02 USD hier einwerfen und den regulären Ausdruck unten angeben, der etwas knapper ist als fast alle der oben genannten , aber auch gründlicher als die meisten anderen. Es hat auch den netten Nebeneffekt, dass die Landesvorwahl in 1 USD und die lokale Nummer in 2 USD belassen wird.

^ \ + (? = \ d {5,15} $) (1 | 2 | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0-6] | 7 | 8 [1-469] | 9 [0-58] | [2-9] ..) (\ d +) $


2

Keine Kritik an diesen großartigen Antworten. Ich möchte nur die einfache Lösung vorstellen, die ich für unsere Ersteller von Administratorinhalten verwende:

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

Erzwingen Sie den Start mit einem Plus oder zwei Nullen und verwenden Sie mindestens ein wenig Zahlen, Leerzeichen, geschweifte Klammern, Minus und Punkt sind optional und keine anderen Zeichen. Sie können alle Nicht-Nummern sicher entfernen und in einem tel: -Eingang verwenden. Zahlen werden eine gemeinsame Form der Darstellung haben und ich muss mir keine Sorgen machen, zu restriktiv zu sein.


1

Eine einfache Version für europäische Nummern, die mit Nummern wie 0034617393211, aber auch mit langen Nummern wie 004401484172842 übereinstimmt.

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

Ich hoffe es hilft :·)


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
Während dieses Code-Snippet die Frage beantworten kann, bietet es keinen Kontext, um zu erklären, wie oder warum. Fügen Sie ein oder zwei Sätze hinzu, um Ihre Antwort zu erklären.
Brandonscript

1

Hier ist eine Regex für die folgenden häufigsten Telefonnummernszenarien. Obwohl dies aus US-amerikanischer Sicht auf Vorwahlen zugeschnitten ist, funktioniert es für internationale Szenarien.

  1. Die tatsächliche Anzahl sollte nur 10 Stellen betragen.
  2. Bei US-Nummern kann die Vorwahl in Klammern () stehen.
  3. Die Landesvorwahl kann 1 bis 3 Stellen lang sein. Optional kann ein + -Zeichen vorangestellt werden.
  4. Zwischen der Landesvorwahl, der Vorwahl und dem Rest der Nummer können Bindestriche, Leerzeichen, Punkte oder keine Leerzeichen stehen.
  5. Eine gültige Telefonnummer kann nicht nur aus Nullen bestehen.

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

Erläuterung:

    ^ - 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

Weitere Beispiele und Erklärungen - https://regex101.com/r/hTH8Ct/2/


1

Ich habe dies unten verwendet:

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

Das Format + CCC.NNNNNNNNNNxEEEE oder 00CCC.NNNNNNNNNNxEEEE

Die Telefonnummer muss bei einem internationalen Anruf mit '+' oder '00' beginnen. wobei C der 1–3-stellige Ländercode ist,

N ist bis zu 14 Stellen,

und E ist die (optionale) Erweiterung.

Das führende Pluszeichen und der Punkt nach dem Ländercode sind erforderlich. Das Literalzeichen "x" ist nur erforderlich, wenn eine Erweiterung angegeben ist.



0

Der internationale Nummerierungsplan basiert auf dem ITU E.164- Nummerierungsplan. Ich denke, das ist der Ausgangspunkt für Ihren regulären Ausdruck.

Ich werde dies aktualisieren, wenn ich einen regulären Ausdruck basierend auf der ITU E.164-Nummerierung erstellen möchte.


0

Dieser Regex-Ausdruck funktioniert für Telefonnummern in Indien, Kanada, Europa, Neuseeland, Australien und den Vereinigten Staaten sowie deren Ländercodes:

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


0

Dies funktioniert bei mir jedoch ohne das Präfix 00, 001, 0011 usw.:

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



0

Ich habe den regulären Ausdruck für europäische Telefonnummern erstellt und er ist spezifisch für das Wählpräfix in Abhängigkeit von der Länge der Nummer.

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

Versuchen Sie dies, ich weiß nicht, ob es eine Telefonnummer gibt, die länger als 12 ist:

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

1
Dies entspricht Zahlen mit genau 12 Ziffern, einschließlich der Landesvorwahl. Das ist falsch, weil es die Längenvariabilität auf der ganzen Welt nicht berücksichtigt. Darüber hinaus beträgt die maximale Länge tatsächlich 15 Stellen .
tmt

1
@tmt Wie wäre es ^(00|\+){1}\d{12,15}$dann?
Turing getestet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.