どうやら、このコードは、電話番号の任意のアルファベット文字を照合することによって、電話番号を検証しようとしている - マッチが行われた場合、その電話番号が無効です。
x
(スペースxスペース)のシーケンスが失敗してトリガーすることを除いて、任意のアルファ文字(オプションではないので、実際には無関係です。 123-123-1234 x 789
.*([a-zA-Z])+(?<! x).*
は非常に接近して:
これは、あなたがのように、電話番号に拡張子を埋め込む人のケースを受け入れたいように聞こえます。
EDIT:これはネガティブなルックバック構造を使用します。 (?<!
は、現在のマッチ位置から正規表現が残っていれば、前の文字はカッコの残りの部分と一致しません。したがって、先頭にx
があった場合、それはマッチに失敗します。
-
この正規表現を使用して、次は一致しません:
- 123-123-1234
- 123-123-1234 x789
- 123-123-1234 X 789
しかし、それは試合を行います。
- 123-123a-1234
- 123から123 asdfasdf 12312
- 123-123x-123123
- xfasdf
123から123と一致するものがのおかげで、無効ですあなたのifステートメントの!
しかし、あなたが電話番号の検証を肯定的な検証(つまり、あなたは何を許している)として書いたのか、否定的な無効化(あなたは特に避けているもの)ではなく、あなたが許可しているものを書くことで、エッジケースをはるかに簡単に防ぐことができます。
たとえば、次のように両方の正規表現のことで一致していない!
- 123 - ### - 1234
- 123 - $#& ^(## ^#* @#(@! &#(# - 。1234
と、これはあなたの関数からtrueを返しますが、あなたが本当に欲しいものということです
私は強く肯定的検証ではなく、負の無効化を示唆?。
EDITは:@Aprillionはこの前のリンク質問を示唆:A comprehensive regex for phone number validation
これは、複雑な電話番号の検証が(あなたが1つの以上の国のために検証している場合は特に)ことができる方法を示しています。そこにはたくさんの良い提案がありますが、それは完全ではない要約ではありません。私の傾向は、電話番号の入力に数字だけを使用できるようにするフロントエンドになります(オプションの自由コメントフィールド付き)。
私は、肯定的な検証に少し信頼感がないことを認めなければなりません - 特にあなたは任意の国際的な#で対処しなければならない場合。
多くはOPの実際の要件に依存します。
あなたは一致させたい文字列のいくつかの特定の例を挙げることができます。 –
空白以外のすべての空白の代わりに空白の '\ s'を意味していません。' \ S' - 実際の仕様は何ですか? – Aprillion
私は有効な電話番号だけを何かを考えています。しかし時には私は "x"も持っていて、それも有効です。 –