Ç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?
Ç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?
Yanıtlar:
\+(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.
^\+((?: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
, ö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
+
+
00
, mesajın kullanılması mesajı doğru göndermezken, a ile başlamak +
her zaman uluslararası çalışır.
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} $
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
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();
}
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)
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 \d
s ile değiştirebilirsiniz .[0-9]
\d
İçin iOS SWIFT Ben, bu yararlı buldu
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
@ 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}$/
Ş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 +) $
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.
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 :·)
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();
}
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.
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/
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.
Telefon numarası doğrulaması için aşağıdaki API'yi deneyin. Ayrıca bu Ülke, Bölge ve Sağlayıcıyı da geri verecektir
demo https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.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.
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}))$"
Bu, işi tamamlamak için RegExp'i gerçekten kullanmasa da - veya belki de bu yüzden - bu bana güzel bir çözüm gibi görünüyor: https://intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html
Bunu dene, benim için çalışıyor.
^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
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"))
Bunu dene, 12'den uzun telefon numarası olup olmadığını bilmiyorum:
^(00|\+){1}\d{12}$
^(00|\+){1}\d{12,15}$
o zaman?