次の形式をサポートする米国標準の電話番号の正規表現を書きたいです。
###-###-####
(###) ###-####
### ### ####
###.###.####
#は任意の数字を意味します。これまでに、次のような表現を思いつきました。
^[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}
それぞれ。最後のものがドット付きチェックに正しいかどうかはよくわかりません。私が言及したさまざまなフォーマットに対応する4つの異なる表現の代わりに単一の表現を書くことができる方法があるかどうかも知りたいです。もしそうなら、私はどうやってそれを行うのかわからない。また、オプションのコンポーネントとして市外局番をサポートするための条件を含めることができるように、式を変更する方法もあります。何かのようなもの
+1 ### ### ####
+ 1は市外局番で、オプションです。
^(\+\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}$
この問題にはさまざまなバリエーションが考えられます。これは私が以前に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
電話番号の入力方法に関係なく、キャプチャグループを使用して電話番号を分類し、コード内で処理することができます。
あなたが興味を持っているならば、これは表現の内訳です:
^\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})の後に疑問符を追加します。
Jsfiddleで上記の解決策を使用して例をまとめる。クライアントの要件に従って、コードを少し修正しました。これが誰かに役立つことを願っています。
/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/
これは私が作成したかなりコンパクトなものです。
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
私が使う電話番号の正規表現:/^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{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
これはどう?
^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}
編集:私は()を忘れていました。編集2:最初の3桁の部分を間違えた。
1、3、4の式は非常に似ているので、次のものを使用できます。
^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$
使用されている正規表現の言語とブランドによっては、\2
の代わりに$2
を配置する必要がある場合や、そのようなマッチングがまったくサポートされていない場合があります。
醜くて不器用で数字の部分を取り出すのを難しくする明らかな^(regex for 1,3,4|regex for 2)$
を除いて、これをフォーマット2と組み合わせる良い方法はありません。
市外局番については、先頭に(\+\d)?
を追加して1桁の市外局番をキャプチャできます(申し訳ありませんが、市外局番の形式はわかりません)。
このコードは米国またはカナダの電話番号と一致し、それが有効な市外局番であることを確認して交換します。
^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d
正規表現は通常の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
@ Raviの答えから始めて、私はいくつかの NPA(Area)Codeの検証規則 も適用しました。
特に:
予約済みブロック(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 +
私の正規表現には、数字グループを抽出するためのグループ化は含まれていませんが、それらを含めるように変更することができます。
おそらく最も簡単なものは他のいくつかと比較します。
\(?\d+\)?[-.\s]?\d+[-.\s]?\d+
次のものと一致します。
(555)444〜6789
555-444-6789
555.444.6789
555 444 6789
「+」で複数の番号を付け、「;」でそれらを区切ります。 "、" " - "、または ""の文字
私はになった
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
^(\+\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 を参照してください。
これは私が考えることができるのと同じくらい多くにマッチし、あなたに国、地域、最初と最後のためにあなたにグループマッチングを与えるより包括的なバージョンです。
(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}