0

私はこの正規表現でこのコードを持っています:

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

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

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

スペース x スペース " x " が文字列にある場合も true を返すようにしたい。この正規表現を変更してこれを含めるにはどうすればよいですか? ありがとう!

4

4 に答える 4

2

どうやら、このコードは電話番号の任意の英字を照合することによって電話番号を検証しようとしています-照合が行われた場合、電話番号は無効です。

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

于 2012-04-25T19:02:41.123 に答える
2
" x |\\S*[a-zA-Z]+\\S*"

または私は何かが欠けていますか?

于 2012-04-25T18:32:19.493 に答える
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
于 2012-04-25T18:39:33.467 に答える
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;

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

于 2012-04-25T19:25:38.653 に答える