0

入力された番号が標準的な米国の電話形式 ((###) ###-####) であることを確認するために使用する正規表現があります。私は正規表現が初めてで、各文字の正確な機能を理解するのにまだ苦労しています。誰かがこの部分を少しずつ読んでくれたり、私が理解していることを確認してくれたりしたら、本当に感謝します. また、正規表現が間違っている場合は、明らかにそれを知りたいです。

\D*?(\d\D*?){10}

私が考えていること:
\D*?( は、括弧のメタ文字のエスケープ シーケンスを示します...なぜ \D*? が必要なのかわかりません
\d は数字を示します
\D*? は数字以外の文字があることを示します (- ) の後に閉じ括弧が続きます
。10 桁の場合は {10}

正規表現がその順序になっている理由などに関して私の理解が非常に曖昧であるように、これを説明するのは非常に不確かです。助け/説明をよろしくお願いします。

編集

これは、私が望むものに最適な正規表現ではないようです。別の可能性は [(][0-9]{3}[)] [0-9]{3}-[0-9]{4} でしたが、これは失敗すると言われました。これを理解するには、正規表現でもう少し作業を行う必要があると思います。

4

3 に答える 3

3

\D数字以外の任意の文字に一致します。

*前の文字が 0 回以上繰り返されることを意味します。

*?正規表現で次の文字が一致するまで、前の文字が 0 回以上繰り返されることを意味します。最初は少し難しいかもしれませんが、正規表現では、次の文字は です\d。つまり\D*?、次の文字までの最小量の文字に一致し\dます。

( ... )はキャプチャ グループであり、物事をグループ化するためにも使用されます。たとえば{10}、前の文字またはグループが正確に 10 回繰り返されることを意味します。

これで、\D*?(\d\D*?){10}数字以外の文字で始まるかどうかにかかわらず、数字の間に数字以外の文字が存在する場合は、正確に 10 個の数字と一致します。

[(][0-9]{3}[)] [0-9]{3}-[0-9]{4}

この正規表現は、(最初​​の正規表現のように)何も受け入れず、フォーマットに一致するため、少し優れています(###) ###-####(スペースは正規表現の文字であることに注意してください!)。

ここで新しく導入されたのは角括弧です。これらは文字クラスを表します。[0-9]これは090、1、2、3、4、5、6、7、8、または 9{3}に一致することを意味します。その後に追加すると、3 つの同様の文字クラスに一致し、この文字クラスには次の文字のみが含まれるため、数字の場合、正確に 3 桁に一致します。

文字クラスは、(orなどの特定の文字をエスケープするために使用できます)(これらはグループのキャプチャまたはグループ化用であることに注意してください)。したがって、リテラル[(]であり、キャプチャ/グループ化に使用される代わりに使用されます。[)]()

\バックスラッシュ ( ) を使用して文字をエスケープすることもできます。したがって:

\([0-9]{3}\) [0-9]{3}-[0-9]{4}

動作します。また、電話番号が上記の形式に一致するかどうかのみを確認する場合は、ライン アンカーの使用をお勧めし^ます。$これにより、文字列には電話番号のみが含まれ、他には何も含まれなくなります。^行頭と$一致し、行末と一致します。したがって、正規表現は次のようになります。

^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$    

ただし、米国の電話番号のさまざまな形式のすべての組み合わせを知っているわけではないため、電話番号の形式が異なる場合は、この正規表現を微調整する必要があるかもしれません。

于 2013-07-09T17:29:11.050 に答える
2

\D は「数字ではありません」; \d は「数字」です。それを念頭に置いて:

これは 0 個以上の非数字に一致し、次に数字と任意の数の非数字文字に 10 回一致します。これは、数値が適切にフォーマットされているかどうかを実際に確認するのではなく、10 桁が含まれていることだけを確認します。そもそも正規表現はあなたが望むものではないと思います。

たとえば、次は正規表現に一致します。

this is some bad text 1 and some more 2 and more 34567890
于 2013-07-09T17:29:15.340 に答える
0

\D は数字以外の文字に一致します * 前の項目を 0 回以上繰り返します ? 最初に出現するものを見つける \d は数字に一致します

あなたのグループは10桁または非桁に一致します

于 2013-07-09T17:34:24.913 に答える