Comment voulez-vous utiliser une expression régulière pour ignorer des chaînes qui contiennent une sous-chaîne spécifique?

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

  •  22-08-2019
  •  | 
  •  

Question

Comment puis-je aller à l'aide d'un lookbehind négatif (ou toute autre méthode) expression régulière pour ignorer les chaînes qui contient une sous-chaîne spécifique?

J'ai lu deux questions stackoverflow précédentes:
java-regexp-pour-file-filtrage
regex-à-match contre-quelque chose- que-est-pas-une-spécifique
substring

Ils sont presque ce que je veux ... mon problème est la chaîne ne se termine pas avec ce que je veux ignorer. Si elle a fait ce ne serait pas un problème.

J'ai le sentiment que cela a à voir avec le fait que lookarounds sont nuls de largeur et quelque chose est correspondant au deuxième passage à travers la chaîne ... mais, je ne suis pas trop sûr des internes.

Quoi qu'il en soit, si quelqu'un est prêt à prendre le temps et l'expliquer, je l'apprécie grandement.

Voici un exemple d'une chaîne d'entrée que je veux ignorer:

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

Voici un exemple d'une chaîne d'entrée que je veux garder pour une autre évaluation:

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

La clé pour moi est que je veux ignorer HTTP GET qui va après une page par défaut de racine du document.

Après mon petit harnais de test et le meilleur RegEx je suis venu avec jusqu'à présent.

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();
}
}
Était-ce utile?

La solution

Pouvez-vous correspondre à peu importe quel chemin qui ne se termine pas avec un /

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

Cela peut aussi être fait en utilisant lookbehind négatif

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

Ici, (?<!/) dit " précédente séquence doit pas Match /".

Autres conseils

Peut-être que je manque quelque chose, mais ne pourrais pas vous aller juste sans expression régulière et d'ignorer quoi que ce soit pour lesquels cela est vrai:

string.contains("/ HTTP")

Comme un chemin de fichier ne sera jamais se terminer par une barre oblique.

Je voudrais utiliser quelque chose comme ceci:

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

Cela correspond à chaque chemin qui est non seulement /FOO/BAR/.

Si vous écrivez Regex ce complexe, je recommande la construction d'une bibliothèque de ressources en dehors de StackOverflow.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top