どの言語でこれを行っているかを述べていないため、正規表現パーサーにどのような制限が課せられているかわかりません。たとえば、traditionalsed
は BRE に限定され、awk と grep は ERE を処理でき、Linux システムの grep は PCRE を処理します。Perl はもちろん、Python や PHP と同様に PCRE も行います。しかし、JavaScript は BRE のサブセットしかサポートしておらず、POSIX クラスの古典的なショートカットの一部が欠けています。
だから...すべてがサポートするBREでこれを行うには、ブラケットは文字通り取られ、範囲制御は制限されます:
^([[:digit:]]\{3\})[[:space:]]\{0,1\}[[:digit:]]\{3\}-[[:digit:]]\{4\}$
しかし、これは大変で苦痛です。少なくとも ERE をサポートするものを使用している可能性があります。
^\([[:digit:]]{3}\)[[:space:]]?[[:digit:]]{3}-[[:digit:]]{4}$
また、パーサーがクラスの短縮形をサポートしている場合は、これをさらに短縮できます。
^\(\d{3}\)\s?\d{3}-\d{4}
この最後のものは、perl または PHP の PCRE サポートで使用できますが、sed、awk、または grep では使用できません。
また、これは入力の検証を処理する良い方法ではないことも指摘しておきます。もっと柔軟性が欲しい。たとえば、次のようにすることをお勧めします。
- 数字以外の文字をすべて取り除く
- 結果が 10 桁の場合は、有効な市外局番を確認します
- 結果が 11 桁で最初の桁が 1 の場合、有効な市外局番を確認します
- それ以外の場合は、これを国際番号と見なします
おそらく、他の条件もいくつか考え出す必要があります。