文字列に特定の文字が含まれていないかどうかを判断する正規表現
-
10-07-2019 - |
質問
今回は簡単な質問。
正規表現を使用して、文字列に文字が含まれていないかどうかをテストしています。式は" [^ x ]"の形式であると考えました。ここで、 x は表示したくない文字ですが、機能していないようです。
たとえば、
Regex.IsMatch("103","[^0]")
and
Regex.IsMatch("103&","[^&]")
両方ともtrueを返します(falseを期待します)。
" [^&]"
の使用を開始し、& \&としてエスケープする必要がありましたが、違いはありませんでした。
アイデア?小さいものだと思います。
また、私は.NETを使用しているので、そのことに留意してください。
編集1:
これが見つかりました、しかし、私が抱えている問題に答えているようには見えません。
Edit2:
Kevin およびジョエルの提案。これらの提案は確かに速くなりますが、この場合に必要な柔軟性を達成できないため、検索でこの質問を見つけた場合は、その答えがニーズに合うかどうかを必ず確認してください。私の場合、正規表現は各行をループするDataTable検証メソッドに渡され、特定の列のその行の内容が渡されるRegExと一致することを確認します。このメソッドを再利用するため検証されている他のいくつかのDataTableについては、次のことを行いました。
- 正規表現を使用して、最も広範な検証を有効にします
- 常に正の一致を探す(つまり!Regex.IsMatch(cell、regexvariable)を使用する代わりに、このメソッドを呼び出すDataTablesの大部分が常にRegex.IsMatch(cell、regexvariable)を使用できることに依存したかった負ではなく正の一致を使用します。
うまくいけば助かります。
解決
あなたの解決策は半分正しいです。あなたが見るマッチは他のキャラクターのためのものです。あなたが言いたいのは、「ちょっと!文字列全体にこの文字が表示されないようにしたい。
その場合、次のようにします。
Regex.IsMatch("103","^[^0]*<*>quot;)
他のヒント
パターン[^ 0]は、ゼロ以外の任意の文字に一致します。どちらの例でも、パターンは最初の文字(&quot; 1&quot;)と一致します。文字列全体にゼロが含まれていないかどうかをテストするには、パターンを&quot; ^ [^ 0] * $&quot;にする必要があります。これは次のようになります。文字列の先頭から開始し、ゼロ以外の任意の数の文字に一致し、直後に文字列の末尾が続きます。ゼロを含む文字列は失敗します。ゼロを含まない文字列はすべて渡されます。
文字列で単一の文字を探している場合、正規表現はちょっとやり過ぎのように思えます。なぜ.IndexOfまたは.Containsを使用しないのですか?
パーサーが到達する最初の文字は&quot; 1&quot;です。これは[^ 0]にも当てはまり、[^&amp;]にも当てはまります。したがって、これらの例の両方でtrueを返します。
あなたは否定を間違った場所に置いています。 [^ x]
は、x以外のすべてに一致します。 xが文字列内にある場合、他の文字もある場合、文字列はまだ式と一致します。代わりに、xが存在する場合はtrueに一致し、関数の結果を否定します。
Not Regex.IsMatch("103", "0")
Not Regex.IsMatch("103&", "&")
これらの簡単な例では、通常のString.IndexOf()またはString.Contains()がより良い選択であることではありません。
JavaScript以外の同じものを探しているときにこの質問に出会いました。私の場合、上記の式は機能しませんでしたが、以下の式に遭遇しました。 (念のため、JavaScriptソリューションを探している他の誰かがここにいる場合もあります。)
^((?! 0)。)* $
このコンストラクトは、ネガティブルックアヘッド
と呼ばれます