Wie würden Sie einen regulären Ausdruck verwenden Strings zu ignorieren, die eine bestimmte Zeichenkette enthalten?

StackOverflow https://stackoverflow.com/questions/530441

  •  22-08-2019
  •  | 
  •  

Frage

Wie würde ich mich über eine negative Lookbehind (oder jede andere Methode) regulären Ausdruck Strings zu ignorieren, die ein bestimmtes Teilzeichen enthält?

Ich habe zwei vorherigen Fragen Stackoverflow lesen:
java-regexp-für-Datei-Filterung
regex-to-Match-gegen-etwas- dass-is-not-a-specific-Teilzeichenfolge

Sie sind fast , was ich will ... mein Problem ist die Zeichenfolge mit nicht zu Ende, was ich ignorieren will. Wenn es dies täte, würde kein Problem sein.

Ich habe das Gefühl, dies mit der Tatsache zu tun, dass lookarounds Null-Breite und etwas auf dem zweiten Durchlauf durch die Zeichenfolge passenden ... aber ich bin nicht allzu sicher der Einbauten.

Wie auch immer, wenn jemand bereit ist, die Zeit zu nehmen und erklären, es werde ich sehr zu schätzen es.

Hier ist ein Beispiel für eine Eingabezeichenfolge, die ich ignoriert werden soll:

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

Hier ist ein Beispiel für eine Eingabezeichenfolge, die ich für die weitere Auswertung behalten möchten:

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

Der Schlüssel für mich ist, dass ich jedes HTTP GET ignorieren möge, die nach einer Dokument-Root-Standardseite werden.

Im Anschluss ist mein kleiner Test-Harnisch und die besten RegEx ich mit so weit habe kommen.

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();
}
}
War es hilfreich?

Lösung

Könnten Sie einen beliebigen Pfad übereinstimmen, die mit einem / nicht zu Ende

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

Dies kann auch unter Verwendung von getan werden negativen Lookbehind

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

Hier (?<!/) sagt "die vorhergehenden Sequenz muss nicht Spiel /".

Andere Tipps

Vielleicht bin ich etwas fehlt hier, konnte aber nicht nur Sie ohne regulären Ausdruck gehen und ignorieren alles, für die dies zutrifft:

string.contains("/ HTTP")

Da ein Dateipfad wird nie mit einem Schrägstrich enden.

Ich würde so etwas wie folgt verwenden:

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

Dies entspricht jeden Pfad, der nicht nur /FOO/BAR/ ist.

Wenn Sie Regex diesen Komplex schreiben, würde ich den Aufbau einer Bibliothek von Ressourcen außerhalb von Stackoverflow empfehlen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top