188

次の形式をサポートする標準的な米国タイプの電話番号の正規表現を作成したいと考えています。

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

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

^[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 は市外局番で、オプションです。

4

21 に答える 21

304
^(\+\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}$
于 2013-05-22T18:52:14.500 に答える
188

この問題には多くのバリエーションが考えられます。これは、私が以前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

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

  • Group1: 国コード (例: 1 または 86)
  • Group2: 市外局番 (例: 800)
  • Group3: Exchange (例: 555)
  • Group4: 加入者番号 (例: 1234)
  • Group5: 内線番号 (例: 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}) の後に疑問符を追加します。

于 2013-05-22T23:03:15.793 に答える
9

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

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
于 2014-11-25T16:06:31.533 に答える
6

私が使用する電話番号の正規表現: /^[+]?(\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
于 2018-08-31T20:00:38.223 に答える
5

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

((\+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
于 2016-03-14T19:06:46.137 に答える
4

Starting with @Ravi's answer, I also applied some validation rules for the NPA (Area) Code.

In particular:

  • It should start with a 2 (or higher)
  • It cannot have "11" as the second and third digits (N11).

There are a couple other restrictions, including reserved blocks (N9X, 37X, 96X) and 555, but I left those out, particularly because the reserved blocks may see future use, and 555 is useful for testing.

This is what I came up with:

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

Alternately, if you also want to match blank values (if the field isn't required), you can use:

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

My test cases for valid numbers (many from @Francis' answer) are:

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

My invalid test cases include:

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

My regular expression does not include grouping to extract the digit groups, but it can be modified to include those.

于 2016-07-28T22:24:02.187 に答える
2

これはどう?

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

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

于 2013-05-22T18:35:51.450 に答える
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 桁の市外局番を取得できます (申し訳ありませんが、市外局番の形式はわかりません)。

于 2013-05-22T18:36:41.620 に答える
2

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

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

以下に一致します。

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

于 2016-11-18T20:55:40.353 に答える
0
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}
于 2013-05-22T18:44:25.277 に答える
0

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

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))
于 2016-08-16T16:54:06.883 に答える
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

于 2018-06-21T14:01:53.797 に答える