4

特定の部分文字列を含む文字列を無視するには、負の後読み (またはその他の方法) 正規表現を使用するにはどうすればよいですか?


以前の 2 つのスタックオーバーフローの質問を読みました

それらはほぼ私が望むものです...私の問題は、文字列が無視したいもので終わっていないことです。もしそうなら、これは問題にはなりません。

これは、ルックアラウンドがゼロ幅であり、文字列の2回目のパスで何かが一致しているという事実に関係していると感じています...しかし、内部についてはあまり確信が持てません。

とにかく、誰かが時間を割いて説明してくれるなら、私は大いに感謝します.

無視したい入力文字列の例を次に示します。

192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] "GET /FOO/BAR/HTTP/1.1" 200 2246

以下は、さらに評価するために残しておきたい入力文字列の例です。

192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] "GET /FOO/BAR/content.js HTTP/1.1" 200 2246

私にとって重要なのは、ドキュメント ルートのデフォルト ページの後にある HTTP GET を無視したいということです。

以下は、私の小さなテスト ハーネスであり、これまでに思いついた最高の RegEx です。

public static void main(String[] args){
String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/ HTTP/1.1\" 200 2246";
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/content.js HTTP/1.1\" 200 2246";
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/content.js HTTP/"; // This works
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/ HTTP/"; // This works
String inRegEx = "^.*(?:GET).*$(?<!.?/ HTTP/)";
try {
  Pattern pattern = Pattern.compile(inRegEx);

  Matcher matcher = pattern.matcher(inString);

  if (matcher.find()) {
    System.out.printf("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
  } else {
    System.out.printf("No match found.%n");
  }
} catch (PatternSyntaxException pse) {
  System.out.println("Invalid RegEx: " + inRegEx);
  pse.printStackTrace();
}
}
4

4 に答える 4

4

で終わらない任意のパスに一致させることができますか?/

String inRegEx = "^.* \"GET (.*[^/]) HTTP/.*$";

これは、否定後読みを使用して行うこともできます

String inRegEx = "^.* \"GET (.+)(?<!/) HTTP/.*$";

ここで(?<!/)は、「のシーケンスが一致してはならない/」と述べています。

于 2009-02-09T23:01:45.760 に答える
0

私は次のようなものを使用します:

"\"GET /FOO/BAR/[^ ]+ HTTP/1\.[01]\""

これは、 だけではないすべてのパスに一致します/FOO/BAR/

于 2009-02-09T23:06:23.017 に答える