1

重複の可能性:
電話番号と国コードを照合する正規表現

現在、この正規表現で電話番号を検証/キャプチャしています:^(\+?(?<country>\d{1,3}?) ?)?(\(?0?(?<area>\d{2})\)? ?)?(?<phone>9?\d{4}[-. ]?\d{4})$

888888888888-88888888.888811 8888-8888(11) 88888888+22 (21) 8888-8888およびこの形式のすべての組み合わせなどの数字を受け入れます。

問題は、国コードなしで市外局番を渡すと (このように:(11) 8888-8888または11 8888-8888または1188888888) 国番号として市外局番の部分 (11) が取得され、市外局番が空のままになることです。

country + area + phoneORのようなものをarea + phoneNOTにするにはどうすればよいcountry + phoneですか? このようなことをしなくても:

^(((\(?0?(?<area>\d{2})\)? ?)?|(\+?(?<country>\d{1,3}?) ?)?(\(?0?(?<area>\d{2})\)? ?)?)(?<phone>9?\d{4}[-. ]?\d{4})$

これは (area+phone|country+area+phone) ですが、area と country の正規表現が 2 回繰り返されます。

4

1 に答える 1

2

実際、2 桁の国コードと 2 桁の市外局番にはあいまいさがあります。正規表現がこのケースにヒットすると、国コードが最初に配置され、市外局番はオプションであるため、市外局番が国番号と見なされます。

解決策 #1 : 否定先読み (?!...) を使用する

この問題を解決するには、2 桁の国コードとそれに続く電話番号を無視するように正規表現に指示することができます。正規表現を十分に小さく保つ (したがって複雑になりすぎないようにする) ために、電話番号の先頭だけを指定することができます。

使用する否定先読みは次のとおりです。(?!9?\d{4})

2 桁の番号は、その後に電話番号の先頭 ( ) が続かない場合にのみ、国コードとして認定され9?\d{4}ます。

最終的な正規表現は次のとおりです。

^(\+?(?<country>\d{1,3}?) ?(?!9?\d{4}))?(\(?0?(?<area>\d{2})\)? ?)?(?<phone>9?\d{4}[-. ]?\d{4})$



解決策 #2: 正規表現のテンプレート化

IMO、フレーバーがテンプレートを使用して正規表現を構築できる場合、それは強力な機能になります。この機能は、私が知っているどのフレーバーにも存在しません。

しかし、回避策があります。次のコードは、C# で記述されたスニペットです。

(...)
string country = "(\\+?(?<country>\\d{1,3}?) ?)";
string area = "(\\(?0?(?<area>\\d{2})\\)? ?)";
string phone = "(?<phone>9?\\d{4}[-. ]?\\d{4})";
string final_regexp = String.Format("^{1}{2}{3}|{2}?{3}$", country, area, phone);
(...)
于 2013-02-04T10:37:43.640 に答える