How do I write a regex to match any string that doesn't meet a particular pattern? I'm faced with a situation where I have to match an (A and ~B) pattern.
8 に答える
先読みアサーションを使用できます。
(?!999)\d{3}
この例は、 以外の 3 桁の数字に一致し999
ます。
しかし、たまたまこの機能を備えた正規表現を実装していない場合 (「正規表現のフレーバーの比較」を参照)、基本的な機能を備えた正規表現を独自に作成する必要があります。
基本構文のみの互換性のある正規表現は次のようになります。
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
これは、 ではない 3 桁のシーケンスにも一致します999
。
文字列内の単語 A に一致させ、単語 B には一致させたくない場合。例: テキストがある場合:
1. I have a two pets - dog and a cat
2. I have a pet - dog
ペットとして犬を飼っていて、猫を飼っていないテキスト行を検索する場合は、次の正規表現を使用できます。
^(?=.*?\bdog\b)((?!cat).)*$
2 行目のみが検索されます。
2. I have a pet - dog
パターンと照合し、ホスト言語を使用して一致のブール結果を反転します。これにより、はるかに読みやすく、保守しやすくなります。
そうではなく、言及されていない簡単な解決策があったため、この古くからの質問を復活させます。(正規表現バウンティクエストの調査中にあなたの質問を見つけました。)
(A and ~B) パターンを一致させなければならない状況に直面しています。
このための基本的な正規表現は驚くほど単純です。B|(A)
全体的な一致を無視して、A を含むグループ 1 のキャプチャを調べるだけです。
例 (正規表現での html の解析に関するすべての免責事項を含む): A は数字、B は以下の数字です。<a tag
正規表現:<a.*?<\/a>|(\d+)
デモ(右下のペインのグループ 1 を見てください)
参照
ここでの私の答えは、あなたの問題も解決するかもしれません:
https://stackoverflow.com/a/27967674/543814
- Replace の代わりに、Match を使用します。
- group の代わりに、 group
$1
と読みます$2
。 - グループ
$2
はそこで非キャプチャになりましたが、これは避けるべきです。
例:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
最初のキャプチャ グループは、回避したいパターンを指定します。最後のキャプチャ グループは、他のすべてをキャプチャします。そのグループを読み上げるだけ$2
です。
(B)|(A)
次に、グループ2のキャプチャを使用します...