標準の10桁の電話番号に一致する正規表現


125

次の形式をサポートする標準のUSタイプの電話番号の正規表現を記述したいと思います。

###-###-####
(###) ###-####
### ### ####
###.###.####

ここで、#は任意の数を意味します。これまでのところ、私は次の表現を思いつきました

^[1-9]\d{2}-\d{3}-\d{4}
^\(\d{3}\)\s\d{3}-\d{4}
^[1-9]\d{2}\s\d{3}\s\d{4}
^[1-9]\d{2}\.\d{3}\.\d{4}

それぞれ。最後の1つがドット付きチェックに適しているかどうかは、よくわかりません。また、私が述べたさまざまな形式に対応する4つの異なる式の代わりに、単一の式を書く方法があるかどうかも知りたいです。もしそうなら、どうすればいいのかわかりません。また、式を変更して、オプションのコンポーネントとして市外局番をサポートするための条件を含めることもできます。何かのようなもの

+1 ### ### ####

ここで、+ 1は市外局番であり、オプションです。


5
stackoverflow.com/questions/123559/…の重複の可能性提案された答えは、数字以外のすべての文字を取り除くことです。このようにして、検証を簡略化します
Arnaud Denoyelle 2013年

1
これはしばらく前のことですが、米国の市外局番を1で始めることはできないと思います。(123)先行する1のため、456-7890は無効になります
。– bobanahalf

より完全な正解については、stackoverflow.com
Joe Johnston

電話番号の解析は難しいです。Googleはこのためのオープンソースライブラリをリリースしました。libphonenumber(または使用言語のフォーク)を使用してください
aloisdgはcodidact.comに移動します

回答:


212
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

次と一致します

123-456-7890
(123) 456-7890
123 456 7890
123.456.7890
+91 (123) 456-7890

米国以外の番号で一致させたくない場合は、

^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

更新:
以下のユーザーSimon Weaverが気づいたように、フォーマットされていない数値の照合にも興味がある場合は、次のように区切り文字クラスをオプションにします。[\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

1
最初の行の(?\ d {3})部分に疑問符は必要ないと思いますか?「(」と「)」内の数字のゼロまたは1回の出現ではなく、1回以上の出現が必要だと思います
noobcoder

2
?括弧でそこ適用され()ていない数字で、。完全な関連する正規表現は\(?\d{3}\)?です。(作成される)オプション(による)の\d{3}間には、3桁の数字が必要であることを指定します。()?
Ravi Thapliyal 2013年

6
注:これは1234567890と一致しません。これは問題である場合とそうでない場合があります。私にとってそれはそうでした-それで私はそれをオプションにするため?にそれぞれの後に追加しました[\s.-]
Simon_Weaver

1
@Simon_Weaverご入力ありがとうございます。私はあなたの観察を答えに加えました。
Ravi Thapliyal 2015年

3
@BobRayで言及された問題を回避したい場合は、を使用してください^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$。(私は基本的に、市外局番をカバーするRegExのセグメントを複製し、括弧付きと括弧なしの1つのバリアントを許可しました)
Shrey Gupta

128

この問題には、さまざまなバリエーションが考えられます。これは、私が以前SOに配置した回答に似た正規表現です。

^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$

次の例とはるかに一致します。

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234

電話番号の入力方法に関係なく、キャプチャグループを使用して電話番号を分類し、コードで処理することができます。

  • グループ1:国コード(例:1または86)
  • グループ2:市外局番(例:800)
  • Group3:Exchange(例:555)
  • Group4:加入者番号(例:1234)
  • グループ5:拡張子(例:5678)

興味がある場合の表現の内訳は次のとおりです。

^\s*                #Line start, match any whitespaces at the beginning if any.
(?:\+?(\d{1,3}))?   #GROUP 1: The country code. Optional.
[-. (]*             #Allow certain non numeric characters that may appear between the Country Code and the Area Code.
(\d{3})             #GROUP 2: The Area Code. Required.
[-. )]*             #Allow certain non numeric characters that may appear between the Area Code and the Exchange number.
(\d{3})             #GROUP 3: The Exchange number. Required.
[-. ]*              #Allow certain non numeric characters that may appear between the Exchange number and the Subscriber number.
(\d{4})             #Group 4: The Subscriber Number. Required.
(?: *x(\d+))?       #Group 5: The Extension number. Optional.
\s*$                #Match any ending whitespaces if any and the end of string.

市外局番をオプションにするには、市外局番の(\ d {3})の後に疑問符を追加します。


7
最良の答えは私見です。私の目的では\s、検証に使用しており、フィールドが既にトリミングされているため、最初と最後のは必要ありません。
ダニエル

1
はるかに最良の答えであり、最も完全です。正規表現の内訳も本当にありがたいです。
ブライアントジャクソン

@コンダル私はあなたがそれを失敗させるために使用している入力に興味があります。国コードに0を指定すると、問題なく動作するようです。
Francis Gagnon 2017年

<input type = "text" name = "phone_no" class = "form-control" ng-pattern = "^ \ s *(?:\ +?(\ d {1,3}))?[-。(] *(\ d {3})[-。)] *(\ d {3})[-。] *(\ d {4})(?: * x(\ d +))?\ s * $ "のみ-numbers ng-maxlength = "10" />
2017年

@コンダル申し訳ありません。あなたが一致させようとしているテキストがこの正規表現で失敗していることを意味しました。
Francis Gagnon 2017年

8

^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

次の電話番号と一致します:

1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

regex101.comを参照


7

これが私が作成したかなりコンパクトなものです。

Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$

Replace: +1 \($1\) $2-$3

次の使用例に対してテストされています。

18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
1--800--123--4567
+1 (800) 123-4567

これは(800 444-4444
Jake

6

jsfiddleで上記のソリューションを使用して例を追加します。クライアントの要件に従ってコードを少し変更しました。これも誰かを助けることを願っています。

/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/

こちらの例をご覧ください


4

これをパキスタンのユーザーに試してみてください。私が作成したかなりコンパクトなものを次に示します。

((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9]

次の使用例に対してテストされています。

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883

4

私が使用する電話番号の正規表現: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

カバー:

  • 18001234567
  • 1 800 123 4567
  • +1 800 123-4567
  • +86 800 123 4567
  • 1-800-123-4567
  • 1(800)123-4567
  • (800)123-4567
  • (800)123-4567
  • (800)1234567
  • 800-123-4567
  • 800.123.4567

2

1、3、4の式は非常に似ているため、次の式を使用できます。

^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$

使用する正規表現の言語とブランドによっては、\2代わりに置く必要がある$2か、そのようなマッチングがまったくサポートされない場合があることに注意してください。

これをフォーマット2と組み合わせる良い方法はないと思います^(regex for 1,3,4|regex for 2)$が、見た目が醜く不器用で、数値の一部を取り出すのが難しいということは明らかです。

市外局番については(\+\d)?、最初に追加して1桁の市外局番をキャプチャできます(申し訳ありませんが、市外局番の形式はわかりません)。


2

これはどう?

^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}

編集:()のことを忘れてしまいました。編集2:最初の3桁の部分が間違っている。


.文字クラスの場合、ドットをエスケープする必要はありません。バックスラッシュと一致させたくないので、[-\.\s]実際には[-.\s]である必要があります。
VedranŠego2013年

実際にバックスラッシュと一致しますか?必要ないのではないかと思ったのですが、100%確信はありませんでした。
crimson_penguin 2013年

あなたが正しいです。私はそれを試したところです(以前はバックスラッシュが必要でしたことはありません)。そして[\.][.]どちらもドットのみに[\\.]一致し、ドットとバックスラッシュの両方に一致します。発言ありがとうございます。
VedranŠego2013年

正規表現についての私の意見は、誰かに正規表現を与える場合は常に説明を伴うか、または正規表現が無意味であるということです。ただ私の意見です。
ジョンレッド

2

@Raviの回答から始めて、NPA(Area)コードにもいくつかの検証ルールを適用しました

特に:

  • 2(またはそれ以上)で始まる必要があります
  • 2桁目と3桁目(N11)に「11」を含めることはできません。

予約済みブロック(N9X、37X、96X)と555を含む他のいくつかの制限がありますが、特に予約済みブロックが将来使用される可能性があり、555がテストに役立つため、それらは省略しました。

これは私が思いついたものです:

^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

または、空白の値にも一致させたい場合(フィールドが必須ではない場合)は、以下を使用できます。

(^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$|^$)

有効な数値(@Francisの回答の多く)のテストケースは次のとおりです。

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234

私の無効なテストケースは次のとおりです。

(003) 555-1212     // Area code starts with 0
(103) 555-1212     // Area code starts with 1
(911) 555-1212     // Area code ends with 11
180055512345       // Too many digits
1 800 5555 1234    // Prefix code too long
+1 800 555x1234    // Invalid delimiter
+867 800 555 1234  // Country code too long
1-800-555-1234p    // Invalid character
1 (800)  555-1234  // Too many spaces
800x555x1234       // Invalid delimiter
86 800 555 1212    // Non-NA country code doesn't have +

私の正規表現には、桁グループを抽出するためのグループ化は含まれていませんが、それらを含めるように変更できます。


2

おそらく他のいくつかと比較して最も簡単な方法です。

\(?\d+\)?[-.\s]?\d+[-.\s]?\d+

次と一致します。

(555)444-6789

555-444-6789

555.444.6789

555 444 6789


完璧な...ありがとう(y)
スシルシャルマ2018

2

このコードは米国またはカナダの電話番号と一致し、有効な市外局番と交換であることも確認します。

^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d

Regex101.comでテストする


2

通常の10桁の電話番号に加えて、オプションの国際コード(1から3桁)とオプションの内線番号(任意の桁数)を検証する正規表現パターン:

/(\+\d{1,3}\s?)?((\(\d{3}\)\s?)|(\d{3})(\s|-?))(\d{3}(\s|-?))(\d{4})(\s?(([E|e]xt[:|.|]?)|x|X)(\s?\d+))?/g

デモ: https //www.regextester.com/103299

有効なエントリ:

/* Full number */
+999 (999) 999-9999 Ext. 99999

/* Regular local phone number (XXX) XXX-XXXX */
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231

/* International codes +XXX (XXX) XXX-XXXX */
+99 1234567890
+991234567890

/* Extensions (XXX) XXX-XXXX Ext. XXX... */
1234567890 Ext 1123123
1234567890Ext 1123123
1234567890 Ext1123123
1234567890Ext1123123

1234567890 Ext: 1123123
1234567890Ext: 1123123
1234567890 Ext:1123123
1234567890Ext:1123123

1234567890 Ext. 1123123
1234567890Ext. 1123123
1234567890 Ext.1123123
1234567890Ext.1123123

1234567890 ext 1123123
1234567890ext 1123123
1234567890 ext1123123
1234567890ext1123123

1234567890 ext: 1123123
1234567890ext: 1123123
1234567890 ext:1123123
1234567890ext:1123123

1234567890 X 1123123
1234567890X1123123
1234567890X 1123123
1234567890 X1123123
1234567890 x 1123123
1234567890x1123123
1234567890 x1123123
1234567890x 1123123

1

この正規表現は、10桁の連絡先番号に使用すると便利です。

^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$

リファレンスhttps : //regex101.com/r/QeQewP/1

説明:

ここに画像の説明を入力してください


その説明を生成するためにツールを使用しましたか?共有してください!ありがとう
不明

@unnknown regex101.comなどのオンライン正規表現チェッカーのスクリーンショットのように見えます。SOガイドラインでは、すべてのテキスト、コード、データ、エラーメッセージは画像ではなくテキスト形式で入力する必要があると明記しています。また、テキストをコピーして貼り付けることはできません。この場合、色が何かを追加する可能性があります、確かではありません。通常、「回答」にはテキストによる説明を含める必要があります。Amitesh:このサイトへのリンクを含めると、訪問者が実験できるように正規表現が既に入力されていると便利です。
SherylHohman

@unnknownは、この投稿に似た画像を生成するリンクです。Amiteshの正規表現文字列は既に貼り付けられています。電話番号を入力して、その結果をテストできます。 regex101.com/r/QeQewP/1
SherylHohman


0

これは、私が思いつく限り一致し、国、地域、最初、最後のグループマッチングを提供する、より包括的なバージョンです。

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))

0

「+」を使用して複数の数値を処理し、「;」でそれらを分離する 「、」、「-」、または「」の文字?


0

私はで終わった

const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');

これは、例えば、オランダの数字のようなものを可能にするためでした

+358 300 20200


0

上記の正規表現は、 @Francis Gagnon.

目的:ユーザーが米国の電話番号を共有できる可能性のあるパターンを検出する


バージョン1:

^\s*(?:\+?(\d{1,3}))?[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

ここCodepenでテストしてください: https

正規表現の説明:https : //regexr.com/4kt5j


バージョン2:

\s*(?:\+?(\d{1,3}))?[\W\D\s]^|()*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

内容:テストケースは文字列の一部である場合があります。バージョン1では、テストケースが機能するための最初のステップになるはずです。

コードペン:https ://codepen.io/kiranbhattarai/pen/GRKGNGG

正規表現の説明:https : //regexr.com/4kt9n


失敗する可能性のあるパターンを見つけた場合は、コメントを入力して修正してください。

テストケース:合格

8 0   0  4  4  4  5   55 5
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234
800 (555) 1234
800(555)1234
8 0 0 5 5 5 1 2 3 4
8.0.0.5.5.5.1.2.3.4
8-0-0-5-5-5-1-2-3-4
(8)005551234
(80)05551234
8(00)5551234
8@0@0@5551234
8/0/0/5/5/5/1/2/3/4
8*0*0*5*5*5*1*2*3*4
8:0:0:5:5:5:1:2:3:4
8,0,0,5,5,5,1,2,3,4
800,555,1234
800:555:1234
1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

+ 86、+ 99などは米国の電話番号ではありません。他のいくつかのテストケースは、他の理由で疑わしく見えます。
tripleee

@tripleeeで修正させていただきました。うまくいくことを願って、どの国でも更新しました。さらに、重複したテストケースも削除しました
Kiran Bhattarai '12

0

私の問題を解決し、@ stormyの回答に基づいていますが、3桁の国コードが含まれており、さらに重要なことに、文字列の任意の場所で使用できますが、一致しないので、この回答をそこに投げ込みます文字列のスペース/開始が先行し、単語境界で終了します。これは、URLまたは何かの途中にある乱数と一致しないようにするのに役立ちます

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.