2

ここSOでは、正規表現否定に関する非常に多くの質問があります 。

なぜ人々が正規表現を否定する必要があると感じるのか、私にはよくわかりません。 正規表現に一致しない結果のみを表示するようなものを使用しないのはなぜですか?grep -v


$ ls
april  august  december  february  january  july  june  march  may  november  october  september
$ ls | grep ber
december
november
october
september
$ ls | grep -v ber
april
august
february
january
july
june
march
may
4

3 に答える 3

9

おそらくgrep、正規表現が使用される唯一の場所ではないからでしょうか? この単純なシナリオで機能します...そして実際には、「この正規表現と一致しない」と言うことができる他の多くのシナリオでも...しかし...まあ、正規表現の一部だけを否定する必要がある場合はどうなりますか? 「これには合っているが、これには合っていない」あなたならどうしますか?すべてを否定することはできません。

于 2010-05-23T06:47:14.760 に答える
2

正規表現全体を否定する必要がないことは正しいですが、より大きなパターン内のサブパターンを否定することに価値があることは確かですか?

簡単な例を次に示します。文字列をランに分割します。Java では、これは単なるspliton(?<=(.))(?!\1)です。

System.out.println(java.util.Arrays.toString(
    "aaaabbbccdeeefg".split("(?<=(.))(?!\\1)")
)); // prints "[aaaa, bbb, cc, d, eee, f, g]"

正規表現は次のとおりです。

  • (?<=(.))- 後ろを向いてキャラクターをキャプチャする\1
  • (?!\1)- マッチを先読みして否定する\1

関連する質問

これらの質問はすべて、否定的な主張を使用しています。

于 2010-05-23T16:23:42.987 に答える
0

私がそれを必要としたことを覚えている 1 つのインスタンスは、Apache 構成でした。Apache では、現在のリクエストが PCRE 正規表現に一致する場合に別の URI にリダイレクトする方法がありますが、現在のリクエストが正規表現に一致しない場合にリダイレクトする方法はありません (少なくとも、私が必要としたときはそうでした) 。 .

ありがたいことに、正規表現の否定正規表現を Google で検索することができました (実際、Google が既に存在していたかどうかはわかりません…)。しかし、確かに時間がかかりました。当時 StackOverflow が存在していれば、はるかに簡単だったでしょう。

于 2010-05-23T08:21:12.240 に答える