どうやら、このコードは電話番号の任意の英字を照合することによって電話番号を検証しようとしています-照合が行われた場合、電話番号は無効です。
x
したがって、シーケンス(スペースxスペース)が一致して失敗をトリガーすることを除いて、任意のアルファ文字(オプションで非空白文字内に埋め込まれますが、これらはオプションとしてリストされているため、実際には無関係です)が必要です。
これは、次のように、電話番号に内線番号を埋め込んでいる人の場合を受け入れたいようです。 123-123-1234 x 789
.*([a-zA-Z])+(?<! x).*
非常に接近します。
編集:これはネガティブルックビハインド構造を使用しています。 (?<!
現在の一致位置から、前の文字が残りの括弧内の文字と一致しない場合にのみ、正規表現を続行できます。したがって、リードがあった場合、x
それは試合に失敗します。
-
この正規表現を使用すると、以下は一致しません。
- 123-123-1234
- 123-123-1234 x789
- 123-123-1234 x 789
しかし、それは一致します:
- 123-123a-1234
- 123-123 asdfasdf 12312
- 123-123x-123123
- 123-123 xfasdf
そして、あなたのifステートメントのおかげで、一致するものは無効です。!
しかし、そうは言っても、電話番号の検証を、否定的な無効化(具体的に何を回避するか)ではなく、肯定的な検証(つまり、何を許可するか)として記述した場合、コードははるかに簡単になります。許可するものを書くことで、エッジケースをはるかに簡単に防ぐことができます。
たとえば、以下は両方の正規表現と一致しません。
- 123-###-1234
- 123-!$#&^(## ^#* @#(!@&#(#-1234
これは関数からtrueを返します。それはあなたが本当に欲しいものですか?
否定的な無効化ではなく、肯定的な検証を強くお勧めします。
編集:@Aprillionは、この以前のリンクされた質問を提案します: 電話番号検証のための包括的な正規表現
これは、電話番号の検証がいかに複雑であるかを示しています(特に、複数の国で検証する場合)。そこにはたくさんの良い提案がありますが、それはすべてを網羅した要約ではありません。私の傾向はフロントエンドで、電話番号の入力に数字(オプションの無料コメントフィールド付き)のみを許可することです。
私はまた、それは私に肯定的な検証に対する自信を少し与えないことを認めなければなりません-特にあなたが任意の国際的な#と取引しなければならない場合。
多くはOPの実際の要件に依存します。