35

今回は簡単な質問です。

正規表現を使用して、文字列に文字が含まれていないかどうかをテストしようとしています。式は「[^ x ]」の形式だと思っていましたが、 xは表示されたくない文字です。しかし、それは機能していないようです。

例えば、

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

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

どちらも true を返します (false が必要です)。

私は使い始めて"[^&]"、& を \& としてエスケープする必要があるのではないかと考えましたが、違いはないようです。

アイデア?些細なことだと思います。

また、私は .NET を使用しているので、そのことを覚えておいてください。

編集1:

私はこれを見つけましが、私が抱えている問題には答えていないようです。

編集2:

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

  1. 正規表現を使用して、幅広い検証を有効にする。
  2. 常に正の一致を探します (つまり、!Regex.IsMatch(cell, regexvariable) を使用する代わりに、このメソッドを呼び出す DataTables の大部分が使用するため、常に Regex.IsMatch(cell, regexvariable) を使用できることに依存したかったのです)ネガティブではなくポジティブマッチ。

うまくいけば、それは役に立ちます。

4

6 に答える 6

53

あなたの解決策は半分正しいです。表示される一致は、他の文字に対するものです。あなたが言いたいことは、「ねえ、文字列全体でこの文字を見たくない」のようなものです。

その場合、次のようにします。

Regex.IsMatch("103","^[^0]*$")
于 2008-10-13T19:45:27.310 に答える
17

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

于 2008-10-13T19:53:54.593 に答える
7

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

于 2008-10-13T19:46:19.757 に答える
4

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

于 2008-10-13T19:45:44.830 に答える
2

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

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

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

これらの単純な例では、通常の String.IndexOf() または String.Contains() がより適切な選択になるわけではありません。

于 2008-10-13T19:47:52.983 に答える
2

私はこの質問に出くわしましたが、同じものを探していましたが、JavaScript. 私の場合、上記の式は機能しませんでしたが、以下の式に出くわしました。(念のため、JavaScript ソリューションを探している他の人もここにたどり着きます。)

^((?!0).)*$

この構造は否定先読みと呼ばれます

于 2010-03-23T20:24:55.443 に答える