Javascriptで米国の電話番号を再フォーマットするための正規表現


97

Javascriptで表示するために、電話番号を再フォーマット(検証ではなく、置換-検証に関する多くの参照があります)したいと考えています。いくつかのデータの例を次に示します。

  • 123 4567890
  • (123)456-7890
  • (123)456-7890
  • 123456 7890
  • 123.456.7890
  • (空白/ null)
  • 1234567890

これを行うために正規表現を使用する簡単な方法はありますか?私はこれを行うための最良の方法を探しています。もっと良い方法はありますか?

番号を次のように再フォーマットしたい: (123) 456-7890


3
そして、それらのどれがあなたのターゲットフォーマットですか?
ヘルゲまで2011

これ:(123)456-7890
Matt K

3
数字以外の文字をすべて削除してから、3つの部分文字列を取得します。
ワイズガイ2011

2
@Wiseguyは、それを回答として(例を挙げて)投稿してください。これは、OPが実際に行うべきことだからです。
Brian Driscoll 2011

1
また、受け入れられた各形式がターゲット形式にどのようにマップされるかを指定する必要があります。これは、入力がnullの場合はまったく明らかではありません。あなたがそのケースを取り除くために追加の条件を使用する気がない限り。
ジョン2011

回答:


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) ? ""からに変更しました。
マットK

2
問題に取り組む方法についての素晴らしいレッスン。私は考えられるすべてのケースに一致する方法を考えようとしていました-あなたは無関係なものを排除し、一致するものがあるかどうかを確認します。非常に素晴らしい。
jkleg 2014年

2
FYIこれは+ 1555-555-5555ような数字では動作しません
ウィル

'' + phoneNumberStringと同じphoneNumberStringです...それはすでに文字列です。
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
ショーンありがとう、私はあなたの短いシンプルなインラインソリューションが好きです。
user752746 2018

1
これをありがとう!x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');たとえば、電話番号の前に「+1」を追加できるように変更しました
Greg A

ありがとう!これは私が必要としているだけです
アルバートイダルゴ

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]}
ピーター・ホリングスワース

実際の問題は、「-」または文字列の中央からのスペースをバックスペースできないことです。ユーザーがバックスペースしているときに再フォーマットを防ぐ必要があります(たとえばnewstring.length < oldstring.length、カーソル位置を追跡し、ユーザーがこれらの区切り文字の上にバックスペースしたときを把握するために、たとえばif (cursorPosition === 4 && numericString.length > 3)
Peter Hollingsworth

私のreactコードでは、入力された数値のみを内部的に保存し、フィールドに配置されたものをフォーマットすることでこれを回避しています。したがって、バックスペースは、表示された値ではなく、実際の値の前の文字を削除します。
デビッドバウカム

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-3210x123の標準形式にフォーマットされます。


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個の数字として保存することを好みますが、電話番号を通常の人やアプリ/電話が自由に認識できる標準形式に変換またはクリーンアップできるようにしたいです。

この投稿に出くわしたのは、PCRE Regex機能を備えた(ただしJava関数を備えていない)テキストクリーナーアプリで使用できるものを探していたためです。さまざまなテキストエディタ、クリーナー、エクスパンダ、さらにはクリップボードマネージャでさえも機能する、単純で純粋な正規表現ソリューションを使用できる人のために、これをここに投稿します。私は個人的にSublimeとTextSoapを使用しています。このソリューションは、メニューバーにあるテキスト石鹸用に作成され、カーソルで選択されたものまたはクリップボードにあるものに対してテキスト操作アクションをトリガーできるドロップダウンメニューを提供します。

私のアプローチは、基本的に2つの置換/検索と正規表現の置換です。各置換検索と置換には、検索用と置換用の2つの正規表現が含まれます。

置換/検索と置換#1

  • 最初の置換/検索と置換では、数値以外の数値が10桁の数値から10桁の文字列に削除されます。

最初の置換/検索正規表現:\D

  • この検索文字列、数字以外のすべての文字に一致します。

最初の置換/正規表現の置換: ""(何も、スペースさえも)

  • 代替フィールドは完全に空白のままにします。スペースを含む空白は存在しないようにします。これにより、一致した数字以外の文字がすべて削除されます。この操作の前に、10桁+フォーマット文字を使用し、フォーマット文字を使用せずに10桁で出力する必要があります。

置換/検索と置換#2

  • 操作の2番目の置換/検索および置換検索部分は、市外局番の$1グループ、3つの番号の2番目のセットの$2キャプチャグループ、および4つの番号の最後のセットの最後のキャプチャグループをキャプチャします$3。操作の代替部分の正規表現は、キャプチャされた数字のグループの間に米国の電話番号のフォーマットを挿入します。

2番目の置換/検索正規表現:(\d{3})(\d{3})(\d{4})

2番目の置換/正規表現の置換\($1\) $2\-$3

  • バックスラッシュは\特殊文字をエスケープし() (<-whitespace)、そして-我々はキャプチャグループにおける当社の捕獲数の間にそれらを挿入されているので$1$2$3米国の電話番号の書式設定の目的のために。

  • TextSoapで、2つの置換操作アクションを含むカスタムクリーナーを作成したので、実際には、スクリプトを実行するのと同じように感じます。このソリューションは改善できると確信していますが、複雑さがかなり増すと思います。このソリューションの改良版は、誰かがこれに追加したい場合の学習体験として歓迎されます。


-2

米国の電話番号の場合

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

この正規表現を小さなフラグメントに分割して、理解しやすいようにしましょう。

  • /^\(?:電話番号がオプションで始まる場合があることを意味します(
  • (\d{3}):オプションの後には、(3桁の数字が必要です。電話番号にがない場合は(、3桁で始まる必要があります。例(308または308
  • \)?:電話番号の)最初の3桁の後にオプションを含めることができることを意味します。
  • [- ]?:次に、電話番号には、存在する場合は-)、または最初の3桁の後に、オプションのハイフン()を含めることができます。
  • (\d{3}):次に、さらに3桁の数字が必要です。例(308)-135または308-135または308135
  • [- ]?:3桁の2番目のセットの後に、電話番号に別のオプションのハイフン(-)を含めることができます。例(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
他のWebサイトからコンテンツを
まで

1
申し訳ありませんが、リンクを投稿する必要があるとは思いもしませんでした。投稿された質問に答えるだけでいいと思いました。
ベブ2011

5
他の誰かを自分のように見せることは決して大丈夫ではありません。次回は、リンクの投稿に問題はありませんが、(特にリンクを提供せずに)コピーすることには問題がないことを覚えておいてください。そして、あなたはいつでもあなたの答えを編集するオプションがあります。
ヘルゲまで2011

著者が要求したように電話番号を置き換える方法に著者が答えなかったため、反対票を投じました。
BrianHVB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.