Hangi normal ifade geçerli uluslararası telefon numaralarıyla eşleşir?


113

Çevirmeden önce bir telefon numarasının geçerli olup olmadığını belirlemem gerekiyor. Telefon görüşmesi dünyanın herhangi bir yerine gidebilir.

Hangi normal ifade geçerli uluslararası telefon numaralarıyla eşleşir?


Herhangi bir normal ifade hizmet dışı numaralar gibi hataları nasıl ele alır? Sadece aramayı deneyin ve geçersiz numarayı diğer hatalarda yaptığınız gibi ele alın.

3
Normal ifadenin bunu belirleyemeyeceği konusunda haklı olsanız da, her giden girişim zaman ve kaynak tüketir. Numarada hızlı bir akıl sağlığı kontrolü yapmak, açıkça sahte bir aramanın değerli bir kanalı engellememesini sağlar.
Abtin Forouzandeh

1
LOL @ paxdiablo .... Sanırım 1-800-CALL-HELP, RegExp testinizi geçecek ... lol
Buhake Sindi

1
Bu soruda net olmayan bir şey, numaraların ABD'den veya dünyanın herhangi bir ülkesinden arandığında geçerli olması gerekip gerekmediğidir, çünkü aşağıdaki çözümlerin çoğu bazı geçerli numaraları doğrulamaz (0030210 12312312 - geçerli Herhangi bir AB ülkesinden Yunan numarası aranır)
Xeroxoid

1
@JonHanna Bir noktayı kabul ediyorum, ancak diğer yandan UX açısından bir kullanıcı 00XX ... X numarası girerse testin geçmesi gerektiğini düşünmüyor musunuz? Kullanıcıların (yani yaşlıların) + 'nın ne olduğunu ve nümerik / telefon tuş takımına nasıl yazılacağını bile bilmediği durumlar vardır. Ayrıca, 00XXX'in + yerine çıkış kodunun kullanıldığı geçerli bir uluslararası sayı olduğunu (yani bir kullanıcının bağlamında) hala iddia edebilirim.
Xeroxoid

Yanıtlar:


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

Genel bir uluslararası telefon numarasını eşleştirmek için doğru biçimdir. ABD sabit hat merkezli uluslararası erişim kodu 011'i standart uluslararası erişim kodu tanımlayıcısı olan '+' ile değiştirerek zorunlu hale getirdim. Ulusal numaranın minimumunu da en az bir haneye değiştirdim.

Cep telefonu adres defterinize bu formatta numara girerseniz, nereye giderseniz gidin adres defterinizdeki herhangi bir numarayı başarıyla arayabileceğinizi unutmayın. Sabit hatlar için, artı işaretini, aradığınız ülkenin uluslararası erişim kodu ile değiştirin.

Bunun ulusal numara planı kurallarını dikkate ALMADIĞINI unutmayın - özellikle, ulusal numara planlarının izin vermeyebileceği yerlerde sıfırlara ve olanlara izin verir ve ayrıca bazı ülkeler için (örneğin ABD) ulusal numara planından daha büyük sayı uzunluklarına izin verir.


5
Bana mantıklı geliyor. Bunu kullanacağım
Yedinci

17
Bu geçerli değil. Avrupa telefon numaraları, başında + olmadan çift 0 ile başlayabilir. Bu nedenle, +44 8984 1234 (İngiltere) gibi bir telefon numarası, bu regexp'in (ve diğer yanıtlarda da) desteklemediği 0044 8984 1234 yazılırsa mükemmel bir şekilde geçerlidir.
Xeroxoid

4
@ Fezfox'un iyileştirmeleri (?) Ve optimize edilmiş uzunluk ile birleştirildi:^\+((?: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 açısından bakıldığında, evet 00, ön tarafa izin vermek mantıklı olabilir . Geliştirme ve bakım açısından bakıldığında, tüm sayıları her aldığınızda bir ile başlamaya +veya hatta değiştirmeye zorlamanın tamamen iyi olduğunu söyleyebilirim - özellikle çoğu insanın formatın farkında olduğu göz önüne alındığında (çoğu uluslararası telefon giriş alanı yine de gerektirir). Ayrıca, tek satırlık bir düzeltme ve çok daha okunaklı. Bu yaklaşım aynı zamanda tüm telefon numaralarının aynı formatta olmasını sağlar ve doğrulamanızı daha az hataya yatkın hale getirir, böylece her şeyi daha sürdürülebilir hale getirir. 00++
milosmns

1
Ayrıca, EDGE öncesi (düz GSM) SMS'in "eski" günlerinde 00, mesajın kullanılması mesajı doğru göndermezken, a ile başlamak +her zaman uluslararası çalışır.
Çıldırabilir

66

Tüm ülke kodları ITU tarafından tanımlanır. Aşağıdaki normal ifade ITU-T E.164 ve ITU Operasyonel Bülteni No. 930 - 15.IV.2009 Ekine dayanmaktadır . Gelecekte kullanılmak üzere ayrılmış tüm mevcut ülke kodlarını ve kodlarını içerir. Biraz kısaltılsa da, her kodu bağımsız olarak eklemeye karar verdim.

Bu, ABD'den gelen aramalar içindir. Diğer ülkeler için, uluslararası erişim kodunu (normal ifadenin başındaki 011) o ülkenin arama planı için uygun olanla değiştirin .

Ayrıca, ITU E.164'ün tam bir uluslararası telefon numarasının maksimum uzunluğunu 15 basamak olarak tanımladığını unutmayın. Bu, üç basamaklı bir ülke kodunun en fazla 12 ek basamakla sonuçlandığı ve 1 basamaklı bir ülke kodunun en fazla 14 ek basamak içerebileceği anlamına gelir. Dolayısıyla

[0-9]{0,14}$

a normal ifadenin sonu.

En önemlisi, bu normal ifade sayının geçerli olduğu anlamına gelmez - her ülke kendi dahili numaralandırma planını tanımlar. Bu yalnızca ülke kodunun geçerli olmasını sağlar.

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
Neredeyse haklıydı ... "011" uluslararası bir yasanın parçası değil. ABD'deki insanların uluslararası bir arama yapmak için çevirmeleri gereken şey bu. Bu önek, nereden aradığınıza bağlı olarak değişecektir ... Yani bu önek numaranın bir parçası DEĞİLDİR.
Gabriel Magana

3
@gmagana - Cevabımda bundan bahsediyorum (2. paragraf)
Abtin Forouzandeh

1
Demek istediğim, telefon numarasının bir parçası olmaması. Bu, "1" ABD ulusal uzun mesafe arama ön ekinin telefon numarasının bir parçası olduğunu söylemek gibidir.
Gabriel Magana

1
@gmagana - telefon numarasının bir parçası olmadığı konusunda haklıyken, aramayı yapmak teknik olarak gereklidir.
Abtin Forouzandeh

2
@Roger Pate: Bunu çözmek için biraz zaman harcadım ve umarım başkaları için faydalı olur. Ayrıca başka birinin daha iyi bir çözüme sahip olabileceğini umuyordum (bu yüzden kendi cevabımı kabul edildi olarak işaretlemedim).
Abtin Forouzandeh

32

Bu daha ileri bir optimizasyondur.

\+(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) geçerli uluslararası öneklere
(ii) ve ardından 9 veya 10 basamaklı, herhangi bir tür veya ayırıcı yerleştirilmesiyle (son iki basamak arası hariç) izin verir

Bu eşleşecek:
+ 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


Bunun eski bir cevap olduğunu biliyorum, ancak Amerikan numaraları için 1'i isteğe bağlı yapma seçeneği var mı?
Adam Fratino

Yapmak istediğiniz şey, (i) "+" seçeneğini isteğe bağlı ve (ii) uluslararası kodu isteğe bağlı yapmaktır. Yani yer "?" + ve ilk kapanış parantezinden sonra.
fezfox

@ManosPasgiannis iyi evet, belirtildiği gibi "ardından 9 veya 10 basamak". 8'i kullandığınız Kıbrıs'ta görünecektir, bu nedenle sadece \ d \ W * örneğini kaldırarak son diziyi ayarlayın ve son ifadeyi (\ d {1,3}) yapın
fezfox

22

Google'daki kitaplık libphonenumber'ı kullanabilirsiniz .

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
Bu iyi bir çözüm olabilir, ancak sadece telefon numaralarını kontrol etmek için, bu kitaplığı kullanmadan önce, büyük miktarda js içe aktarmanız gerekir ... çünkü libphonenumber.js kapatma kitaplığına ihtiyaç duyar ... bu hafif bir çözüm değildir: /
J. BizMai

11

Bu, uluslararası numaralar için çalışacaktır;

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

Bunu kullanıyorum:

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

Avantajlar: + veya 011 başlangıçlarını tanır, gerektiği kadar uzun olmasını sağlar ve birçok uzatma kuralını yönetir. (# X, dahili uzama)


Bu, çoğu uluslararası telefon numarası biçimine oldukça yakındır.
ücretela

9

Normal ifadenizin "optimize edilmiş" bir versiyonu:

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

Normal ifade söz diziminiz desteklemiyorsa \ds ile değiştirebilirsiniz .[0-9]\d



6

@ Eric'in normal ifadesi değiştirildi - tüm ülke kodlarının bir listesini ekledi (bunları xxxdepy @ Github'dan aldım . Umarım faydalı bulursun:

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

Tıkır tıkır çalışıyor. Hollanda telefon numaraları için de. Teşekkürler!
mauvm

2

Şimdiye kadar verilen farklı cevapların hepsinde de görüldüğü gibi, bunu yapmanın çok sayıda yolu olduğu açıktır, ancak buraya 0,02 $ değerimi atacağım ve aşağıdaki normal ifadeyi sunacağım, ki bu neredeyse yukarıdakilerin hepsinden biraz daha kısadır. ama aynı zamanda çoğundan daha kapsamlı. Ayrıca ülke kodunu 1 $ ve yerel numarayı 2 $ olarak bırakmanın güzel yan etkisine de sahiptir.

^ \ + (? = \ 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

Bu harika yanıtlarla ilgili hiçbir eleştiri yok. Yalnızca yönetici içerik oluşturucularımız için kullandığım basit çözümü sunmak istiyorum:

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

Bir artı veya iki sıfır ile başlamaya zorlayın ve en az bir miktar sayı, beyaz boşluk, kaşlı ayraçlar, eksi ve nokta kullanın ve diğer karakterleri kullanmayın. Tüm sayı olmayanları güvenle kaldırabilir ve bunu bir tel: girişinde kullanabilirsiniz. Sayıların ortak bir temsil şekli olacak ve kısıtlayıcı olma konusunda endişelenmeme gerek yok.


1

0034617393211 gibi numaralarla eşleşmenin yanı sıra 004401484172842 gibi uzun olanlarla da eşleşen Avrupa numaraları için basit bir versiyon.

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

Umarım yardımcı olur :·)


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
Bu kod parçacığı soruyu yanıtlasa da, nasıl veya neden olduğunu açıklamak için herhangi bir bağlam sağlamaz. Cevabınızı açıklamak için bir veya iki cümle eklemeyi düşünün.
brandonscript

1

Aşağıda, aşağıdaki en yaygın telefon numarası senaryoları için bir normal ifade bulunmaktadır. Bu, alan kodları için ABD perspektifinden uyarlanmış olsa da, uluslararası senaryolar için çalışır.

  1. Gerçek sayı yalnızca 10 basamaklı olmalıdır.
  2. ABD numaraları için alan kodu parantez () içine alınabilir.
  3. Ülke kodu 1 ila 3 hane uzunluğunda olabilir. İsteğe bağlı olarak önünde bir + işareti olabilir.
  4. Ülke kodu, alan kodu ve numaranın geri kalanı arasında kısa çizgiler, boşluklar, noktalar olabilir veya hiç boşluk olmayabilir.
  5. Geçerli bir telefon numarasının tamamı sıfır olamaz.

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

Açıklama:

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

Daha fazla örnek ve açıklama - https://regex101.com/r/hTH8Ct/2/


1

Bunu aşağıda kullandım:

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

+ CCC.NNNNNNNNNNxEEEE veya 00CCC.NNNNNNNNNNxEEEE biçimi

Uluslararası arama için telefon numarası "+" veya "00" ile başlamalıdır. burada C 1-3 haneli ülke kodudur,

N 14 haneye kadar,

ve E (isteğe bağlı) uzantıdır.

Baştaki artı işareti ve ülke kodunu izleyen nokta gereklidir. Değişmez "x" karakteri yalnızca bir uzantı sağlanmışsa gereklidir.



0

Uluslararası numaralandırma planı, ITU E.164 numaralandırma planına dayanmaktadır . Sanırım bu, normal ifadenizin başlangıç ​​noktasıdır.

ITU E.164 numaralandırmasına dayalı bir normal ifade oluşturmak için biraz uğraşırsam bunu güncelleyeceğim.


0

Bu Normal İfadesi Hindistan, Kanada, Avrupa, Yeni Zelanda, Avustralya, Amerika Birleşik Devletleri telefon numaralarının yanı sıra ülke kodlarında da geçerlidir:

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


0

Bu, 00, 001, 0011 vb. Önekler olmadan benim için çalışıyor:

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



0

Avrupa telefon numaraları için normal ifade hazırladım ve numara uzunluğu ile çevirme önekine göre özeldir.

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

Bunu dene, 12'den uzun telefon numarası olup olmadığını bilmiyorum:

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

1
Bu , ülke kodu dahil tam olarak 12 hanesi olan numaralarla eşleşir . Bu yanlış çünkü dünyadaki uzunluk değişkenliğini hesaba katmıyor. Üstelik maksimum uzunluk aslında 15 hanedir .
tmt

1
@tmt Peki ^(00|\+){1}\d{12,15}$o zaman?
2018
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.