유효한 국제 전화 번호와 일치하는 정규 표현식은 무엇입니까?


113

전화를 걸기 전에 전화 번호가 유효한지 확인해야합니다. 전화는 전 세계 어디로 든 갈 수 있습니다.

유효한 국제 전화 번호와 일치하는 정규 표현식은 무엇입니까?


정규식은 서비스 번호와 같은 오류를 어떻게 처리합니까? 다른 오류와 마찬가지로 잘못된 번호를 호출하고 처리하십시오.

3
정규식이 이것을 결정할 수 없다는 것은 맞지만 각 아웃 바운드 시도는 시간과 리소스를 소비합니다. 번호에 대한 빠른 온 전성 확인을 수행하면 명백하게 가짜 전화가 중요한 채널을 차단하지 않도록합니다.
Abtin Forouzandeh

1
LOL @ paxdiablo .... 1-800-CALL-HELP가 RegExp 테스트를 통과 할 것
같네요

1
이 질문에서 명확하지 않은 것은 아래의 대부분의 솔루션이 일부 유효한 번호 (예 : 0030210 12312312-유효한 EU 국가에서 전화 한 그리스 번호)
Xeroxoid

1
@JonHanna 나는 요점에 동의하지만, 반면에 UX 관점에서 사용자가 00XX ... X 번호를 입력하면 테스트가 통과해야한다고 생각하지 않습니까? 사용자 (예 : 노인)가 +가 무엇인지, 숫자 / 전화 키패드에서 입력하는 방법도 모르는 경우가 있습니다. 또한 00XXX가 + 대신 종료 코드가 사용 된 유효한 국제 번호 (즉, 사용자 컨텍스트)라고 주장 할 수 있습니다.
Xeroxoid

답변:


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

일반 국제 전화 번호를 일치시키기위한 올바른 형식입니다. 미국 유선 중심의 국제 액세스 코드 011을 표준 국제 액세스 코드 식별자 '+'로 대체하여 필수로 지정했습니다. 또한 국가 번호의 최소값을 한 자리 이상으로 변경했습니다.

이 형식의 번호를 휴대폰 주소록에 입력하면 여행지에 관계없이 주소록에있는 모든 번호로 성공적으로 전화를 걸 수 있습니다. 유선 전화의 경우 플러스를 전화를 거는 국가의 국제 액세스 코드로 바꾸십시오.

이것은 국가 번호 계획 규칙을 고려하지 않습니다. 특히 국가 번호 계획이 허용하지 않는 위치에서 0과 1을 허용하고 일부 국가 (예 : 미국)의 국가 번호 계획보다 긴 번호 길이를 허용합니다.


5
나에게 현명 해 보인다. 이걸 사용하겠습니다
Sevenearths 2011-09-06

17
이것은 유효하지 않습니다. 유럽 ​​전화 번호는 처음에 +없이 이중 0으로 시작할 수 있습니다. 따라서 다음과 같은 전화 번호는 +44 8984 1234 (영국)이 정규식 (및 다른 답변에서도)이 지원하지 않는 0044 8984 1234로 작성된 경우에도 완벽하게 유효합니다.
Xeroxoid 2015-08-11

4
(?) @ fezfox의 개선과 결합 길이 최적화 :^\+((?: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$
삼환

1
+1. UX 관점에서 볼 때 00앞에서 허용하는 것이 합리적 일 수 있습니다 . 보기의 개발 및 유지 관리 관점에서, 나는 그것이 시작하는 모든 숫자를 시행 완벽하게 정상적으로 말하고 싶지만 +대체 짝수 또는 00로모그래퍼 +때마다 당신은 그것을 얻을 - 특히 대부분의 사람들이 알고 주어진 +(포맷하는 대부분의 국제 전화 입력 필드 어쨌든 필요). 또한 한 줄짜리 수정으로 더 읽기 쉽습니다. 이 접근 방식은 또한 모든 전화 번호가 동일한 형식인지 확인하고 유효성 검사가 오류 발생 가능성을 훨씬 줄여 주므로 전체를보다 쉽게 ​​유지 관리 할 수 ​​있습니다.
milosmns

1
또한 EDGE 이전 (일반 GSM) SMS의 "오래된"날에는를 사용 00하면 메시지가 제대로 전송되지 않는 반면 a로 시작 +하면 항상 국제적으로 작동합니다. 우리는 미쳐서 그것을 매우 복잡하게 만들 수 있지만 때로는 우리의 삶을 더 편하게 만들기 위해 몇 가지 제약을 제거하는 것이 가능하거나 가치가 있습니다. :)
milosmns

66

모든 국가 코드는 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} $


12
거의 맞았습니다 ... "011"은 국제 코드의 일부가 아닙니다. 미국 사람들이 국제 전화를 걸기 위해 전화를 걸어야하는 것입니다. 해당 접두사는 전화를 거는 위치에 따라 변경됩니다. 따라서 해당 접두사는 번호의 일부가 아닙니다.
Gabriel Magana

3
@gmagana-내 대답 (2 항)에서 언급합니다
Abtin Forouzandeh

1
내 요점은 전화 번호의 일부가 아니라는 것입니다. 이는 "1"미국 국내 장거리 전화 접두사가 전화 번호의 일부라고 말하는 것과 같습니다.
Gabriel Magana

1
@gmagana-전화 번호의 일부가 아니라는 것은 맞지만 전화를 걸려면 기술적으로 필요합니다.
Abtin Forouzandeh

2
@Roger Pate : 나는 이것을 알아내는 데 약간의 시간을 보냈고 다른 사람들에게 유용하기를 바랍니다. 나는 또한 다른 누군가가 더 나은 해결책을 가질 수 있기를 바랐습니다 (이것이 내 답변을 수락 한 것으로 표시하지 않은 이유입니다).
Abtin Forouzandeh

32

이것은 추가 최적화입니다.

\+(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


나는 이것이 오래된 대답이라는 것을 알고 있지만 미국 번호에 대해 1을 선택 사항으로 만드는 옵션이 있습니까?
Adam Fratino

원하는 것은 (i) "+"를 선택 사항으로 만들고 (ii) 국제 코드를 선택 사항으로 만드는 것입니다. 그래서 "?" + 뒤와 첫 번째 닫는 괄호 뒤.
fezfox

@ManosPasgiannis 예, "다음에 9 또는 10 자리 숫자"로 지정됨. 8을 사용하는 키프로스에서 나타날 것이므로 \ d \ W *의 한 번 인스턴스를 제거하여 마지막 시퀀스를 조정하고 마지막 표현식 (\ d {1,3})을
만드십시오.

22

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();
    }

2
좋은 해결책이 될 수 있지만,이 라이브러리를 사용하기 전에 엄청난 양의 js를 가져와야합니다. libphonenumber.js에는 클로저 라이브러리가 필요하기 때문입니다 . 가벼운 해결책이 아닙니다. /
J. BizMai

11

이것은 국제 전화 번호에 적용됩니다.

씨#:

@"^((\+\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

나는 이것을 사용한다 :

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

장점 : + 또는 011 시작을 인식하고 필요한만큼 길게 만들며 많은 확장 규칙을 처리합니다. (#, x, ext, extension)


이것은 대부분의 국제 전화 번호 형식에 매우 가깝습니다.
feeela

9

다음은 정규식의 "최적화 된"버전입니다.

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

정규식 구문이를 지원하지 않는 경우 \ds를로 바꿀 수 있습니다 .[0-9]\d



6

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

매력처럼 작동합니다. 네덜란드 전화 번호도 마찬가지입니다. 감사!
mauvm

2

지금까지 주어진 모든 다른 답변에서 알 수 있듯이이 작업을 수행하는 방법에는 여러 가지가 있지만 여기에 $ 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 +) $


2

이러한 훌륭한 답변에 대한 비판은 없지만 관리자 콘텐츠 제작자에게 사용하는 간단한 솔루션을 제시하고 싶습니다.

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

더하기 또는 두 개의 0으로 강제 시작하고 최소한 약간의 숫자, 공백, 중괄호, 빼기 및 점은 선택 사항이며 다른 문자는 사용하지 않습니다. 숫자가 아닌 모든 항목을 안전하게 제거하고 tel : 입력에 사용할 수 있습니다. 숫자는 일반적인 표현 형태를 가지며 제한적인 것에 대해 걱정할 필요가 없습니다.


1

0034617393211과 같은 숫자와 일치하지만 004401484172842와 같은 긴 숫자와 일치하는 유럽 숫자에 대한 간단한 버전입니다.

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

도움이되기를 바랍니다 : ·)


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
이 코드 스 니펫은 질문에 답할 수 있지만 그 방법과 이유를 설명하는 컨텍스트를 제공하지는 않습니다. 답을 설명하기 위해 한두 문장을 추가해보십시오.
brandonscript

1

다음은 가장 일반적인 전화 번호 시나리오에 대한 정규식입니다. 이것은 지역 코드에 대한 미국 관점에서 조정되었지만 국제 시나리오에서 작동합니다.

  1. 실제 숫자는 10 자리 여야합니다.
  2. 미국 번호의 경우 지역 번호를 괄호 ()로 묶을 수 있습니다.
  3. 국가 코드의 길이는 1 ~ 3 자리입니다. 선택적으로 + 기호가 앞에 올 수 있습니다.
  4. 국가 번호, 지역 번호 및 나머지 번호 사이에 대시, 공백, 점이 있거나 공백이 없을 수 있습니다.
  5. 유효한 전화 번호는 모두 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/


1

나는 이것을 아래에서 사용했습니다.

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

+ CCC.NNNNNNNNNNxEEEE 또는 00CCC.NNNNNNNNNNxEEEE 형식

국제 전화의 경우 전화 번호는 '+'또는 '00'으로 시작해야합니다. 여기서 C는 1-3 자리 국가 코드입니다.

N은 최대 14 자리입니다.

E는 (선택적) 확장입니다.

선행 더하기 기호와 국가 코드 다음의 점이 필요합니다. 리터럴 "x"문자는 확장자가 제공되는 경우에만 필요합니다.



0

국제 번호 매기기 계획은 ITU E.164 번호 매기기 계획을 기반으로합니다 . 이것이 정규 표현식의 시작점이라고 생각합니다.

ITU E.164 번호 매기기를 기반으로 정규식을 만들려면이 정보를 업데이트하겠습니다.


0

이 Regex 표현식은 국가 코드와 함께 인도, 캐나다, 유럽, 뉴질랜드, 오스트레일리아, 미국 전화 번호에서 작동합니다.

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


0

이것은 00, 001, 0011 등 접두사 없이도 나를 위해 작동합니다.

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



0

유럽 ​​전화 번호에 대한 정규식을 만들었으며 다이얼 접두사 대 번호 길이에 대해 구체적입니다.

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

이것을 시도하십시오. 12보다 긴 전화 번호가 있는지 모르겠습니다.

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

1
이는 국가 코드를 포함하여 정확히 12 자리 숫자 와 일치합니다 . 이는 전 세계의 길이 가변성을 고려하지 않기 때문에 잘못된 것입니다. 또한 최대 길이는 실제로 15 자리 입니다.
tmt

1
@tmt ^(00|\+){1}\d{12,15}$그럼 어때?
turingtested 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.