webdevqa.jp.net

文字列に特定の文字が含まれていないかどうかを判断する正規表現

今回は簡単な質問。

正規表現を使用して、文字列に文字が含まれているかどうかをテストしようとしています。式は「[^x]」の形式であると考えました。ここで、xは表示したくないキャラクターですが、それは機能していないようです。

例えば、

Regex.IsMatch("103","[^0]")

そして

Regex.IsMatch("103&","[^&]")

両方ともtrueを返します(falseを期待します)。

"[^&]"そして、おそらく&を\&としてエスケープする必要があると考えましたが、違いは見られませんでした。

アイデア?小さいものだと思います。

また、私は.NETを使用しているので、そのことに留意してください。

編集1:

this を見つけましたが、私が抱えている問題に答えているようには見えません。

編集2:

Kevin および Joel の提案に応答したかった。これらの提案は確かに速くなりますが、この場合に必要な柔軟性を達成できないため、検索でこの質問を見つけた場合は、回答がニーズに合うかどうかを必ず確認してください。私の場合、正規表現は各行をループするDataTable検証メソッドに渡され、特定の列のその行の内容が渡されるRegExと一致することを確認します。このメソッドを再利用するため検証されている他のいくつかのDataTableについて、私は次のことを望んでいました。

  1. Regexを使用して、最も広範な検証を有効にします。
  2. 常に正の一致を探します(つまり!Regex.IsMatch(cell、regexvariable)を使用する代わりに、このメソッドを呼び出すDataTablesの大部分は負ではなく正の一致。

うまくいけばそれが助けになる。

34
jerhinesmith

あなたのソリューションは半分正しいです。あなたが見るマッチは他のキャラクターのためのものです。あなたが言いたいのは、「ちょっと!文字列全体でこの文字を見たくない」というようなものです。

その場合、次のことを行います。

Regex.IsMatch("103","^[^0]*$")
51
Jorge Ferreira

パターン[^ 0]は、ゼロ以外の任意の文字に一致します。どちらの例でも、パターンは最初の文字(「1」)に一致します。文字列全体にゼロが含まれていないかどうかをテストするには、パターンを「^ [^ 0] * $」にする必要があります。これは次のようになります。文字列の先頭から開始し、ゼロ以外の任意の数の文字に一致し、直後に文字列の末尾が続きます。ゼロを含む文字列は失敗します。ゼロを含まない文字列はすべて通過します。

17
Ken Paul

文字列で単一の文字を探している場合、正規表現はちょっとやり過ぎのように思えます。なぜ.IndexOfまたは.Containsを使用しないのですか?

7
Kevin

パーサーが到達する最初の文字は「1」で、これは[^ 0]にも当てはまり、[^&]にも当てはまるため、これらの例の両方でtrueを返します。

4
stephenbayer

あなたは否定を間違った場所に置いています。 [^x]は、x以外のすべてに一致します。 xが文字列内にある場合、他の文字もある場合、文字列はまだ式と一致します。代わりに、xが存在する場合はtrueに一致し、関数の結果を否定します。

Not Regex.IsMatch("103", "0")

Not Regex.IsMatch("103&", "&")

これらの単純な例ではなく、通常のString.IndexOf()またはString.Contains()の方が適しています。

2
Joel Coehoorn

JavaScript以外の同じものを探しているときにこの質問に出会いました。私の場合、上記の式は機能しませんでしたが、次の式に遭遇しました。 (念のため、JavaScriptソリューションを探している他の誰かがここにいる場合もあります。)

^((?!0).)*$

このコンストラクトは Negative Lookahead と呼ばれます

2
Brett