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?
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?
Antworten:
\+(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).
^\+((?: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$
00
vorne zuzulassen . Unter dem Gesichtspunkt der Entwicklung und Wartung würde ich sagen, dass es vollkommen in Ordnung ist, alle Nummern zu erzwingen +
, um sie 00
bei +
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.
00
wü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 :)
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} $
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
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();
}
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}$/
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)
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 \d
s durch ersetzen, [0-9]
wenn Ihre Regex-Syntax dies nicht unterstützt \d
.
Für iOS SWIFT fand ich das hilfreich,
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
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}$/
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 +) $
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.
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 :·)
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();
}
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.
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/
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.
Probieren Sie die folgende API zur Überprüfung der Telefonnummer aus. Auch dies gibt das Land, das Gebiet und den Anbieter zurück
Demo https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.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.
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}))$"
Auch wenn dies nicht wirklich RegExp verwendet, um die Arbeit zu erledigen - oder vielleicht aus diesem Grund -, scheint dies für mich eine gute Lösung zu sein: https://intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html
Versuchen Sie dies, es funktioniert für mich.
^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
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"))
Versuchen Sie dies, ich weiß nicht, ob es eine Telefonnummer gibt, die länger als 12 ist:
^(00|\+){1}\d{12}$
^(00|\+){1}\d{12,15}$
dann?