特定のパターンに一致しない文字列に一致する正規表現を作成するにはどうすればよいですか? (Aと〜B)パターンを一致させなければならない状況に直面しています。
先読みアサーションを使用できます。
(?!999)\d{3}
この例は、999
以外の3桁に一致します。
しかし、この機能を備えた正規表現の実装がない場合( 正規表現の味の比較 を参照)、基本的な機能を備えた正規表現を独自に構築する必要があります。
基本的な構文のみの互換性のある正規表現は次のようになります。
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
これは、999
以外の3桁のシーケンスとも一致します。
文字列内の単語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と〜B)パターンを一致させなければならない状況に直面しています。
これの基本的な正規表現は恐ろしく単純です:B|(A)
全体の一致を無視し、Aを含むグループ1のキャプチャを調べます。
例(正規表現でのHTMLの解析に関するすべての免責事項を含む):Aは数字、Bは<a tag
内の数字
正規表現:<a.*?<\/a>|(\d+)
デモ (右下のペインでグループ1を見る)
参照
(B)|(A)
次に、グループ2がキャプチャするものを使用します...
ここでの私の答えもあなたの問題を解決するかもしれません:
https://stackoverflow.com/a/27967674/543814
$1
の代わりに、グループ$2
を読み取ります。$2
はそこでキャプチャーされません。これは避けてください。例:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
最初のキャプチャグループは、回避するパターンを指定します。最後のキャプチャグループは、他のすべてをキャプチャします。そのグループ、$2
を読み上げるだけです。