전화를 걸기 전에 전화 번호가 유효한지 확인해야합니다. 전화는 전 세계 어디로 든 갈 수 있습니다.
유효한 국제 전화 번호와 일치하는 정규 표현식은 무엇입니까?
전화를 걸기 전에 전화 번호가 유효한지 확인해야합니다. 전화는 전 세계 어디로 든 갈 수 있습니다.
유효한 국제 전화 번호와 일치하는 정규 표현식은 무엇입니까?
답변:
\+(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을 표준 국제 액세스 코드 식별자 '+'로 대체하여 필수로 지정했습니다. 또한 국가 번호의 최소값을 한 자리 이상으로 변경했습니다.
이 형식의 번호를 휴대폰 주소록에 입력하면 여행지에 관계없이 주소록에있는 모든 번호로 성공적으로 전화를 걸 수 있습니다. 유선 전화의 경우 플러스를 전화를 거는 국가의 국제 액세스 코드로 바꾸십시오.
이것은 국가 번호 계획 규칙을 고려하지 않습니다. 특히 국가 번호 계획이 허용하지 않는 위치에서 0과 1을 허용하고 일부 국가 (예 : 미국)의 국가 번호 계획보다 긴 번호 길이를 허용합니다.
^\+((?: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
앞에서 허용하는 것이 합리적 일 수 있습니다 . 보기의 개발 및 유지 관리 관점에서, 나는 그것이 시작하는 모든 숫자를 시행 완벽하게 정상적으로 말하고 싶지만 +
대체 짝수 또는 00
로모그래퍼 +
때마다 당신은 그것을 얻을 - 특히 대부분의 사람들이 알고 주어진 +
(포맷하는 대부분의 국제 전화 입력 필드 어쨌든 필요). 또한 한 줄짜리 수정으로 더 읽기 쉽습니다. 이 접근 방식은 또한 모든 전화 번호가 동일한 형식인지 확인하고 유효성 검사가 오류 발생 가능성을 훨씬 줄여 주므로 전체를보다 쉽게 유지 관리 할 수 있습니다.
00
하면 메시지가 제대로 전송되지 않는 반면 a로 시작 +
하면 항상 국제적으로 작동합니다. 우리는 미쳐서 그것을 매우 복잡하게 만들 수 있지만 때로는 우리의 삶을 더 편하게 만들기 위해 몇 가지 제약을 제거하는 것이 가능하거나 가치가 있습니다. :)
모든 국가 코드는 ITU에서 정의합니다. 다음 정규식은 ITU-T E.164 및 ITU 운영 게시판 번호 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} $
이것은 추가 최적화입니다.
\+(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 자리 숫자, 구분 기호의 유형 또는 배치 (마지막 두 자리 제외)를 허용합니다.
일치합니다 :
+ 1-234-567-8901
+ 61-234-567-89-01
+ 46-234 5678901
+1 (234) 56
89901 +1 (234) 56-89901
+46.234.567.8901
+1 / 234 / 567 / 8901
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();
}
들어 아이폰 OS SWIFT 나는이 도움이되었다고합니다
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
@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}$/
지금까지 주어진 모든 다른 답변에서 알 수 있듯이이 작업을 수행하는 방법에는 여러 가지가 있지만 여기에 $ 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 +) $
0034617393211과 같은 숫자와 일치하지만 004401484172842와 같은 긴 숫자와 일치하는 유럽 숫자에 대한 간단한 버전입니다.
^0{2}[0-9]{11,}
도움이되기를 바랍니다 : ·)
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();
}
다음은 가장 일반적인 전화 번호 시나리오에 대한 정규식입니다. 이것은 지역 코드에 대한 미국 관점에서 조정되었지만 국제 시나리오에서 작동합니다.
유효한 전화 번호는 모두 0 일 수 없습니다.
^(?!\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/
전화 번호 확인을 위해 다음 API를 사용해보세요. 또한 이것은 국가, 지역 및 공급자를 반환합니다.
데모 https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0
이것이 작업을 완료하기 위해 실제로 RegExp를 사용하지는 않지만-또는 그 때문에-이것은 나에게 좋은 해결책처럼 보입니다 : https://intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html
유럽 전화 번호에 대한 정규식을 만들었으며 다이얼 접두사 대 번호 길이에 대해 구체적입니다.
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"))
이것을 시도하십시오. 12보다 긴 전화 번호가 있는지 모르겠습니다.
^(00|\+){1}\d{12}$
^(00|\+){1}\d{12,15}$
그럼 어때?