web-dev-qa-db-ja.com

正規表現-特定のパターン以外をすべて一致させる方法

特定のパターンに一致しない文字列に一致する正規表現を作成するにはどうすればよいですか? (Aと〜B)パターンを一致させなければならない状況に直面しています。

165
notnot

先読みアサーションを使用できます。

(?!999)\d{3}

この例は、999以外の3桁に一致します。


しかし、この機能を備えた正規表現の実装がない場合( 正規表現の味の比較 を参照)、基本的な機能を備えた正規表現を独自に構築する必要があります。

基本的な構文のみの互換性のある正規表現は次のようになります。

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

これは、999以外の3桁のシーケンスとも一致します。

189
Gumbo

文字列内の単語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
28
Aleks

パターンと一致し、ホスト言語を使用して、一致のブール結果を反転します。これにより、はるかに読みやすく、保守しやすくなります。

15
Ben S

言及されていない簡単な解決策があったため、この古代の質問を復活させないでください。 ( 正規表現バウンティクエスト の調査中に質問を見つけました。)

(Aと〜B)パターンを一致させなければならない状況に直面しています。

これの基本的な正規表現は恐ろしく単純です:B|(A)

全体の一致を無視し、Aを含むグループ1のキャプチャを調べます。

例(正規表現でのHTMLの解析に関するすべての免責事項を含む):Aは数字、Bは<a tag内の数字

正規表現:<a.*?<\/a>|(\d+)

デモ (右下のペインでグループ1を見る)

参照

状況s1、s2、s3を除くパターンの一致方法

...以外のパターンの一致方法

7
zx81

正規言語の補完も正規言語ですが、構築するには正規言語用に DFA を構築し、有効な状態変更をエラーに変更する必要があります。例については this を参照してください。ページが言っていないのは、/(ac|bd)//(a[^c]?|b[^d]?|[^ab])/に変換したということです。 DFAから正規表現への変換は簡単ではありません。前に提案したように、正規表現を変更せずに使用し、コードのセマンティクスを変更できると簡単です。

4
Juliano

パターン-再

str.split(/re/g) 

パターンを除くすべてを返します。

テスト ここ

1
unigogo
(B)|(A)

次に、グループ2がキャプチャするものを使用します...

0
DW.

ここでの私の答えもあなたの問題を解決するかもしれません:

https://stackoverflow.com/a/27967674/543814

  • Replaceの代わりに、Matchを使用します。
  • グループ$1の代わりに、グループ$2を読み取ります。
  • グループ$2はそこでキャプチャーされません。これは避けてください。

例:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

最初のキャプチャグループは、回避するパターンを指定します。最後のキャプチャグループは、他のすべてをキャプチャします。そのグループ、$2を読み上げるだけです。

0
Timo