2012-04-25 26 views
0

:私はスペースXスペース「x」は文字列であるかのようにそれを作りたい正規表現の特殊文字

string lPattern = "\\S*[a-zA-Z]+\\S*"; 

System.Text.RegularExpressions.Regex lRegex = 
    new System.Text.RegularExpressions.Regex(lPattern); 

if (!lRegex.IsMatch(phone)) 
{ 
    return true; 
} 

もtrueを返しますです。これを含めるには、この正規表現をどのように変更しますか?ありがとう!

+0

あなたは一致させたい文字列のいくつかの特定の例を挙げることができます。 –

+0

空白以外のすべての空白の代わりに空白の '\ s'を意味していません。' \ S' - 実際の仕様は何ですか? – Aprillion

+0

私は有効な電話番号だけを何かを考えています。しかし時には私は "x"も持っていて、それも有効です。 –

答えて

2

どうやら、このコードは、電話番号の任意のアルファベット文字を照合することによって、電話番号を検証しようとしている - マッチが行われた場合、その電話番号が無効です。

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の実際の要件に依存します。

+0

+1正の妥当性確認のため –

+0

あなたが提供したRegExは私が必要とするものです。すべてを処理するのではなく、私がやっていることに十分です。ありがとう! –

+0

Cool。私は、正規表現についてもう少し詳しく、ネガティブなルック・バックについて簡単な行を追加しました。 –

2
" x |\\S*[a-zA-Z]+\\S*" 

何か不足していますか?

+0

あなたはおそらく '\ s'をここに置きます – BrokenGlass

+0

@BrokenGlassいいえ、私は..しかしOPは - ちょうどその質問の下のコメントで彼/彼女に尋ねた: – Aprillion

0
string lPattern = @"^\s*[a-zA-Z]+\s*$"; 

// Start of string 
// Zero or more white space 
// Letters any case 1 or more 
// Zero or more white space 
// End of string 

\S means anything other than whitespace 
\s is to match for whitespace 
0

電話番号を検証する場合は、ロジックを回すことをおすすめします。つまり、無効ではなく有効な電話番号を見つけようとします。あなたが拒否したいすべての可能性を考えるよりも、一致させたいものを制限する方が簡単です。

私はこの正規表現使用する

(\d+(?:-|\s)?)+(?:\s*x\s*\d+)? 

をし、コードになるでしょう:

string lPattern = @"(\d+(?:-|\s)?)+(?:\s*x\s*\d+)?"; 

     System.Text.RegularExpressions.Regex lRegex = new System.Text.RegularExpressions.Regex(lPattern); 

     if (lRegex.IsMatch(phone)) return true; 

それはあなたが後にしているものではないならあなたには、いくつかのコンテキストを提供する必要があります。

関連する問題