質問
特定のパターンに一致しない文字列に一致する正規表現を作成するにはどうすればよいですか? (Aと〜B)パターンを一致させなければならない状況に直面しています。
解決
先読みアサーションを使用できます:
(?!999)\d{3}
この例は、999
以外の3桁に一致します。
ただし、この機能を使用して正規表現を実装していない場合(正規表現フレーバーの比較)、おそらく基本的な機能を備えた正規表現を自分で作成する必要があります。
基本的な構文のみの互換性のある正規表現は次のようになります。
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
これは、<=>ではない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)
全体の一致を無視して、グループ1のキャプチャを調べます。これにはAが含まれます。
例(正規表現でのHTMLの解析に関するすべての免責事項を含む):Aは数字、Bは<a tag
正規表現:<a.*?<\/a>|(\d+)
デモ(右下のペインでグループ1を見る)
参照
通常の言語の補語も通常の言語ですが、構築するにはを構築する必要があります通常の言語ではDFA を使用し、有効な状態の変更をエラーに変更します。例については、こちらをご覧ください。ページが言っていないのは、/(ac|bd)/
を/(a[^c]?|b[^d]?|[^ab])/
に変換したということです。 DFAから正規表現への変換は簡単ではありません。前に提案したように、正規表現を変更せずに使用し、コードのセマンティクスを変更できると簡単です。
ここでの私の答えはあなたの問題も解決するかもしれません:
https://stackoverflow.com/a/27967674/543814
- Replaceの代わりに、Matchを使用します。
- グループ
$1
の代わりに、グループ$2
を読みます。 - グループ
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
はキャプチャせずに作成されました。これは避けてください。
例:
<=>
最初のキャプチャグループは、回避するパターンを指定します。最後のキャプチャグループは、他のすべてをキャプチャします。そのグループ<=>を読み上げるだけです。
(B)|(A)
次に、グループ2がキャプチャするものを使用します...