Come si usa un'espressione regolare di ignorare le stringhe che contengono una stringa specifica?

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

  •  22-08-2019
  •  | 
  •  

Domanda

Come potrei fare per utilizzare un lookbehind negativo (o qualsiasi altro metodo) espressione regolare di ignorare le stringhe che contiene una stringa specifica?

Ho letto due domande StackOverflow precedenti:
java-regexp-per-file-filtraggio
regex-to-match-contro-qualcosa- che-è-not-a-specific-stringa

Sono quasi quello che voglio ... il mio problema è la stringa non termina con quello che voglio ignorare. Se lo ha fatto questo non sarebbe un problema.

Ho la sensazione che questo ha a che fare con il fatto che lookarounds sono pari a zero-width e qualcosa è raffigurato sul secondo passaggio attraverso la stringa ... ma, io sono nessuno troppo sicuro delle parti interne.

In ogni caso, se qualcuno è disposto a prendere il tempo e spiegarlo io apprezzo molto.

Ecco un esempio di una stringa di input che voglio ignorare:

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

Ecco un esempio di una stringa di input che voglio conservare per un'ulteriore valutazione:

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

La chiave per me è che io voglio ignorare qualsiasi HTTP GET che sta andando dopo una pagina predefinita radice del documento.

A seguito di una mia breve test harness e la migliore RegEx mi è venuta in mente finora.

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();
}
}
È stato utile?

Soluzione

Potresti adattarsi a qualsiasi percorso che non si esaurisce con un /

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

Questo può anche essere fatto utilizzando lookbehind negativo

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

Qui, (?<!/) dice: " che precede sequenza deve non partita /".

Altri suggerimenti

Forse mi manca qualcosa qui, ma non potevo semplicemente andare senza alcuna espressione regolare e ignorare tutto ciò per cui questo è vero:

string.contains("/ HTTP")

A causa di un percorso di file non avrà mai fine con una barra.

Vorrei usare qualcosa di simile:

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

Questo corrisponde a ogni percorso che non è solo /FOO/BAR/.

Se si sta scrivendo Regex questo complesso, mi sento di raccomandare la costruzione di una libreria di risorse al di fuori della StackOverflow.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top