자바 스크립트로 미국 전화 번호를 재 형식화하는 정규식


97

Javascript로 표시하기 위해 전화 번호를 다시 형식화 (유효성 검사가 아닌 대체, 유효성 검사에 대한 참조가 많이 있음)하려고합니다. 다음은 일부 데이터의 예입니다.

  • 123 4567890
  • (123) 456-7890
  • (123)456-7890
  • 123456 7890
  • 123.456.7890
  • (공백 / 널)
  • 1234567890

이를 위해 정규식을 사용하는 쉬운 방법이 있습니까? 이 작업을 수행하는 가장 좋은 방법을 찾고 있습니다. 더 좋은 방법이 있습니까?

번호를 다음과 같이 다시 포맷하고 싶습니다. (123) 456-7890


3
그리고 그중 어떤 것이 목표 형식입니까?
Till Helge 2011

이것은 : (123) 456-7890
Matt K

3
숫자가 아닌 모든 문자를 제거한 다음 세 개의 하위 문자열을 취합니다.
Wiseguy

2
@Wiseguy 대답으로 게시하십시오 (예제 포함), 그것이 실제로 OP 가해 야 할 일이기 때문입니다.
Brian Driscoll 2011

1
또한 허용 된 각 형식이 대상 형식에 매핑되는 방식을 지정해야합니다. 이는 입력이 null 인 경우 전혀 명확하지 않습니다. 그 사건을 제거하기 위해 추가 조건을 기꺼이 사용하지 않는 한.
Jon

답변:


240

" (123) 456-7890" 형식을 원한다고 가정합니다 .

function formatPhoneNumber(phoneNumberString) {
  var cleaned = ('' + phoneNumberString).replace(/\D/g, '')
  var match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/)
  if (match) {
    return '(' + match[1] + ') ' + match[2] + '-' + match[3]
  }
  return null
}

다음은 선택적 +1국제 코드 를 허용하는 버전입니다 .

function formatPhoneNumber(phoneNumberString) {
  var cleaned = ('' + phoneNumberString).replace(/\D/g, '')
  var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/)
  if (match) {
    var intlCode = (match[1] ? '+1 ' : '')
    return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('')
  }
  return null
}
formatPhoneNumber('+12345678900') // => "+1 (234) 567-8900"
formatPhoneNumber('2345678900')   // => "(234) 567-8900"

2
완전한; 감사합니다! 하지만 이 기능을 추가 한 후로 변경 return (!m) ? null했습니다 return (!m) ? "".
Matt K

2
문제에 접근하는 방법에 대한 좋은 교훈입니다. 가능한 모든 경우를 일치시키는 방법을 생각하려고했습니다. 관련없는 항목을 제거하고 일치 항목이 있는지 확인합니다. 아주 좋아.
Jkleg

2
참고로이 + 1555-555-5555 같은 번호가 작동하지 않습니다

'' + phoneNumberStringphoneNumberString... 과 동일 합니다. 이미 문자열입니다.
YungGun

누군가가 숫자로 함수를 호출하지 않는 한 @YungGun (예formatPhoneNumber(8001231234)
maerics

32

가능한 해결책:

function normalize(phone) {
    //normalize string and remove all unnecessary characters
    phone = phone.replace(/[^\d]/g, "");

    //check if number length equals to 10
    if (phone.length == 10) {
        //reformat and return phone number
        return phone.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
    }

    return null;
}

var phone = '(123)4567890';
phone = normalize(phone); //(123) 456-7890

27

var x = '301.474.4062';
    
x = x.replace(/\D+/g, '')
     .replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');

alert(x);


1
Sean에게 감사합니다. 간단한 인라인 솔루션이 마음에 듭니다.
user752746

1
감사합니다! 나는 그것을 변경 x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');예를 들어 전화 번호 앞에 '1'추가하기위한 작업에
그렉에게

감사! 이것은 단지 내가 필요합니다
Albert Hidalgo

8

이 대답은 maerics의 대답에서 차용합니다. 부분적으로 입력 된 전화 번호를 받아들이고 입력 된 부분의 형식을 지정한다는 점에서 주로 다릅니다.

phone = value.replace(/\D/g, '');
const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
if (match) {
  phone = `${match[1]}${match[2] ? ' ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}`;
}
return phone

이것은 입력하는 동안 작동하며 소스 포스터에서 원하는 형식을 추가합니다. 1.5 시간의 검색 끝에 이것을 시도해 보니 기쁩니다!
fungusanthrax

도움이된다면 지역 코드 주위에 괄호를 추가했습니다.(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
Peter Hollingsworth

실제로 문제는 '-'또는 중간 문자열의 공백 위로 백 스페이스 할 수 없다는 것입니다. 사용자가 백 스페이스 일 때 포맷 변경을 방지해야합니다 (예 : newstring.length < oldstring.lengthOR 커서 위치를 추적하고 사용자가 해당 구분자 위에 백 스페이스를 적용한시기를 파악합니다. 예if (cursorPosition === 4 && numericString.length > 3)
Peter Hollingsworth

내 반응 코드에서 입력 한 숫자 만 내부적으로 저장 한 다음 필드에 배치되는 형식을 지정하여이 문제를 해결합니다. 따라서 백 스페이스는 표시된 값이 아닌 실제 값에서 이전 문자를 제거합니다.
David Baucum

5

이 기능을 사용하여 미국 번호 형식을 지정합니다.

function formatUsPhone(phone) {

    var phoneTest = new RegExp(/^((\+1)|1)? ?\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})( ?(ext\.? ?|x)(\d*))?$/);

    phone = phone.trim();
    var results = phoneTest.exec(phone);
    if (results !== null && results.length > 8) {

        return "(" + results[3] + ") " + results[4] + "-" + results[5] + (typeof results[8] !== "undefined" ? " x" + results[8] : "");

    }
    else {
         return phone;
    }
}

미국 전화 번호를 작성하는 거의 모든 상상할 수있는 방법을 허용합니다. 결과는 (987) 654-3210 x123의 표준 형식으로 지정됩니다.


3

거꾸로 생각

첫 번째 "1"을 무시하고 마지막 숫자 만 (최대 10 개) 가져옵니다.

function formatUSNumber(entry = '') {
  const match = entry
    .replace(/\D+/g, '').replace(/^1/, '')
    .match(/([^\d]*\d[^\d]*){1,10}$/)[0]
  const part1 = match.length > 2 ? `(${match.substring(0,3)})` : match
  const part2 = match.length > 3 ? ` ${match.substring(3, 6)}` : ''
  const part3 = match.length > 6 ? `-${match.substring(6, 10)}` : ''    
  return `${part1}${part2}${part3}`
}

입력시 입력 / 출력 예

formatUSNumber('+1333')
// (333)

formatUSNumber('333')
// (333)

formatUSNumber('333444')
// (333) 444

formatUSNumber('3334445555')
// (333) 444-5555

1
var numbers = "(123) 456-7890".replace(/[^\d]/g, ""); //This strips all characters that aren't digits
if (numbers.length != 10) //wrong format
    //handle error
var phone = "(" + numbers.substr(0, 3) + ") " + numbers.substr(3, 3) + "-" + numbers.substr(6); //Create format with substrings

0

다음은 내선 번호가있는 전화 번호와 전화 번호를 모두 허용하는 것입니다.

function phoneNumber(tel) {
var toString = String(tel),
    phoneNumber = toString.replace(/[^0-9]/g, ""),
    countArrayStr = phoneNumber.split(""),
    numberVar = countArrayStr.length,
    closeStr = countArrayStr.join("");
if (numberVar == 10) {
    var phone = closeStr.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"); // Change number symbols here for numbers 10 digits in length. Just change the periods to what ever is needed.
} else if (numberVar > 10) {
    var howMany = closeStr.length,
        subtract = (10 - howMany),
        phoneBeginning = closeStr.slice(0, subtract),
        phoneExtention = closeStr.slice(subtract),
        disX = "x", // Change the extension symbol here
        phoneBeginningReplace = phoneBeginning.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"), // Change number symbols here for numbers greater than 10 digits in length. Just change the periods and to what ever is needed. 
        array = [phoneBeginningReplace, disX, phoneExtention],
        afterarray = array.splice(1, 0, " "),
        phone = array.join("");

} else {
    var phone = "invalid number US number";
}
return phone;
}

phoneNumber("1234567891"); // Your phone number here

0

이 기능을 사용하여 유효한 전화 번호를 확인하고 정규화 할 수 있습니다.

let formatPhone = (dirtyNumber) => {
 return dirtyNumber.replace(/\D+/g, '').replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
}

let isPhone = (phone) => {
   //normalize string and remove all unnecessary characters
   phone = phone.replace(/\D+/g, '');
   return phone.length == 10? true : false;
}

0

나는 확장 한 데이비드 Baucum의 답변을 길이가 4 자리로 확장에 대한 지원을 포함 할 수 있습니다. 또한 원래 질문에서 요청한 괄호도 포함됩니다. 이 형식은 필드에 입력 할 때 작동합니다.

phone = phone.replace(/\D/g, '');
const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})(\d{0,4})$/);
if (match) {
    phone = `(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}${match[4] ? ' x' : ''}${match[4]}`;
}
return phone;

0

사용자가 특히 문자열 중간에서 구분 기호 위로 백 스페이스를 시도 할 때 거의 모든 문제가 발생합니다.

다음은이를 처리하고 편집 할 때 커서가 올바른 위치에 있는지 확인하는 jquery 솔루션입니다.

//format text input as phone number (nnn) nnn-nnnn
$('.myPhoneField').on('input', function (e){
    var $phoneField = e.target;
    var cursorPosition = $phoneField.selectionStart;
    var numericString = $phoneField.value.replace(/\D/g, '').substring(0, 10);

    // let user backspace over the '-'
    if (cursorPosition === 9 && numericString.length > 6) return;

    // let user backspace over the ') '
    if (cursorPosition === 5 && numericString.length > 3) return;
    if (cursorPosition === 4 && numericString.length > 3) return;

    var match = numericString.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
    if (match) {
        var newVal = '(' + match[1];
        newVal += match[2] ? ') ' + match[2] : '';
        newVal += match[3] ? '-' + match[3] : '';

        // to help us put the cursor back in the right place
        var delta = newVal.length - Math.min($phoneField.value.length, 14);      
        $phoneField.value = newVal;
        $phoneField.selectionEnd = cursorPosition + delta;
    } else {
        $phoneField.value = '';        
    }
})

0

위의 솔루션은 특히 Java를 사용하고 국제 코드 접두사 또는 추가 내선 번호와 같은 10 자리 이상의 숫자가있는 경우 더 우수합니다. 이 솔루션은 기본적이며 (정규식 세계의 초보자입니다) 미국 전화 번호를 염두에두고 설계되었으며 일부 서식 문자가 포함 된 숫자 10 개만 있거나 서식 문자가 전혀없는 문자열에만 유용합니다 (단지 10 개 숫자 ). 따라서 반자동 응용 프로그램에만이 솔루션을 권장합니다. 저는 개인적으로 문자 형식을 지정하지 않고 숫자를 10 개의 숫자로 저장하는 것을 선호하지만, 일반 사람들과 앱 / 전화가 즉시 인식 할 수있는 표준 형식으로 전화 번호를 변환하거나 정리할 수 있기를 원합니다.

나는 PCRE Regex 기능이있는 텍스트 클리너 앱 (Java 기능은 없음)과 함께 사용할 수있는 것을 찾고있는이 게시물을 보았습니다. 다양한 텍스트 편집기, 클리너, 확장기 또는 일부 클립 보드 관리자에서 작동 할 수있는 단순하고 순수한 Regex 솔루션을 사용할 수있는 사람들을 위해 여기에 게시합니다. 저는 개인적으로 Sublime과 TextSoap을 사용합니다. 이 솔루션은 메뉴 모음에있는 Text Soap 용으로 만들어졌으며 커서로 선택한 항목이나 클립 보드에있는 항목에 대해 텍스트 조작 작업을 트리거 할 수있는 드롭 다운 메뉴를 제공합니다.

내 접근 방식은 본질적으로 두 가지 대체 / 검색 및 정규식 바꾸기입니다. 각 대체 검색 및 바꾸기에는 검색 용과 바꾸기 용으로 하나씩 두 개의 정규식이 포함됩니다.

대체 / 검색 및 바꾸기 # 1

  • 첫 번째 대체 / 검색 및 바꾸기는 숫자가 아닌 숫자를 10 자리 숫자에서 10 자리 문자열로 제거합니다.

첫 번째 대체 / 검색 정규식 :\D

  • 이 검색 문자열 은 숫자 가 아닌 모든 문자와 일치합니다 .

첫 번째 대체 / 정규식 바꾸기 : ""(공백도 아님)

  • 대체 필드는 완전히 비워 두십시오. 공백을 포함하여 공백이 없어야합니다. 그러면 일치하는 숫자가 아닌 모든 문자가 삭제됩니다. 이 작업을 수행하기 전에 10 자리 + 서식 지정 문자를 입력하고 서식 지정 문자가 아닌 10 자리 숫자를 입력해야합니다.

대체 / 검색 및 바꾸기 # 2

  • 작업의 두 번째 대체 / 검색 및 바꾸기 검색 부분은 지역 코드 $1그룹 $2, 세 번호의 두 번째 집합에 대한 캡처 그룹, 네 번호의 마지막 집합에 대한 마지막 캡처 그룹을 캡처합니다 $3. 작업 의 대체 부분에 대한 정규식 은 캡처 된 숫자 그룹 사이에 미국 전화 번호 형식을 삽입합니다.

두 번째 대체 / 검색 정규식 :(\d{3})(\d{3})(\d{4})

두 번째 대체 / 정규식 바꾸기 :\($1\) $2\-$3

  • 백 슬래시는 \특수 문자를 이스케이프 (, ), (<-whitespace), 그리고 -우리가 캡처 그룹에 우리의 캡처 숫자간에 삽입되어 있기 때문에 $1, $2, $3미국 전화 번호 서식을 목적으로합니다.

  • TextSoap에서 두 가지 대체 작업 동작을 포함하는 사용자 지정 클리너를 만들었으므로 실제로 스크립트를 실행하는 것과 동일하게 느껴집니다. 이 솔루션이 개선 될 수 있다고 확신하지만 복잡성이 상당히 높아질 것으로 예상합니다. 이 솔루션의 개선 된 버전은 누구든지 여기에 추가하려는 경우 학습 경험으로 환영합니다.


-2

미국 전화 번호의 경우

/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/

이 정규식을 이해하기 쉽도록 작은 조각으로 나눕니다.

  • /^\(?: 전화 번호가 선택 사항으로 시작할 수 있음을 의미합니다 (.
  • (\d{3}): 선택 사항 뒤에 (3 자리 숫자가 있어야합니다. 전화 번호에가없는 경우 (3 자리 숫자로 시작해야합니다. 예 : (308또는 308.
  • \)?: 전화 번호는 )처음 3 자리 뒤에 선택 사항이있을 수 있음을 의미합니다 .
  • [- ]?: 다음으로 전화 번호는 존재하는 경우 뒤에 또는 처음 3 자리 -뒤에 선택적 하이픈 ( )을 포함 할 수 있습니다 ).
  • (\d{3}): 그런 다음 3 자리 숫자가 더 있어야합니다. 예 (308)-135또는 308-135또는308135
  • [- ]?: 두 번째 3 자리 숫자 뒤에는 다른 선택적 하이픈 ( -)이 포함될 수 있습니다 . 예 (308)-135-또는 308-135-또는308135-
  • (\d{4})$/: 마지막으로 전화 번호는 4 자리 숫자로 끝나야합니다. 예 (308)-135-7895또는 308-135-7895또는 308135-7895또는3081357895 .

    참조 :

http://www.zparacha.com/phone_number_regex/


1
다른 웹 사이트에서 내용을 복사 한 다음 링크를 게시하지 않는 것은 매우 나쁜 행동입니다. zparacha.com/phone_number_regex
Till Helge

1
죄송합니다. 링크를 게시해야한다는 사실을 몰랐습니다. 게시 된 질문에 대한 답변 만 제공하면된다고 생각했습니다.
Bebu 2011

5
다른 사람을 자신의 것처럼 보이게 만드는 것은 절대로 좋지 않습니다 . 다음 번에 링크를 게시하는 데 아무런 문제가 없다는 것을 기억하십시오. 그러나 복사 (특히 링크를 제공하지 않고)는 그렇지 않습니다. 그리고 항상 답을 수정할 수있는 옵션이 있습니다.
Till Helge 2011

저자가 요청한대로 전화 번호 를 바꾸는 방법에 대해 저자가 답변하지 않았기 때문에 반대 투표를했습니다 .
BrianHVB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.