¿Cómo utilizaría una expresión regular para ignorar las cadenas que contienen una subcadena específica?

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

  •  22-08-2019
  •  | 
  •  

Pregunta

¿Cómo hago para usar una búsqueda hacia atrás negativo (o cualquier otro método) expresión regular para ignorar cadenas que contiene una subcadena específica?

He leído dos preguntas anteriores stackoverflow:
java-regexp-de-archivo-filtrado
expresiones regulares-a-partido-contra-algo- que-no-es-un-específica-subcadena

Son casi lo que quiero ... mi problema es la cadena no termina con lo que yo quiero pasar por alto. Si lo hiciera esto no sería un problema.

Tengo la sensación de que esto tiene que ver con el hecho de que lookarounds son de anchura cero y algo que es coincidente en la segunda pasada a través de la cadena de ... pero, estoy seguro de que ninguno de los también internos.

De todos modos, si alguien está dispuesto a tomar el tiempo y explicarlo yo aprecio mucho a él.

A continuación se muestra un ejemplo de una cadena de entrada que quiero ignorar:

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

A continuación se muestra un ejemplo de una cadena de entrada que quiero seguir para una evaluación adicional:

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

La clave para mí es que quiero hacer caso omiso de cualquier HTTP GET que se va después de una página por defecto raíz del documento.

Lo que sigue es mi pequeño instrumento de prueba y la mejor expresión regular que he encontrado hasta el momento.

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();
}
}
¿Fue útil?

Solución

Podría simplemente igualar cualquier camino que no termina con un /

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

Esto también se puede hacer utilizando de búsqueda hacia atrás negativo

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

A continuación, (?<!/) dice " anterior secuencia debe no / partido".

Otros consejos

Tal vez me estoy perdiendo algo, pero no podía usted sólo tiene que ir sin ningún tipo de expresión regular e ignorar cualquier cosa por la que esto es cierto:

string.contains("/ HTTP")

Debido a una ruta de archivo no tendrá fin con una barra.

Me gustaría utilizar algo como esto:

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

Esto coincide hasta el camino que no es sólo /FOO/BAR/.

Si está escribiendo Regex este complejo, recomendaría la construcción de una biblioteca de recursos fuera de StackOverflow.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top