regex - probar - expresiones regulares javascript caracteres especiales
¿Regex para todas las cadenas que no contienen una cadena? (7)
A menos que esté "grepping" ... ya que no está utilizando el resultado de una coincidencia, ¿por qué no buscar las cadenas que terminan en .config y omitirlas? En Python:
import re
isConfig = re.compile(''/.config$'')
# List lst is given
filteredList = [f.strip() for f in lst if not isConfig.match(f.strip())]
Sospecho que esto se ejecutará más rápido que un re más complejo.
Esta pregunta ya tiene una respuesta aquí:
Ok, entonces esto es algo completamente estúpido, pero es algo que simplemente nunca aprendí a hacer y es una molestia.
¿Cómo puedo especificar una cadena que no contiene una secuencia de otros caracteres. Por ejemplo, quiero hacer coincidir todas las líneas que NO terminan en ''.config''
Pensaría que podría hacer
.*[^(/.config)]$
pero esto no funciona (¿por qué no?)
Se que puedo hacer
.*[^/.][^c][^o][^n][^f][^i][^g]$
pero por favor por favor dime que hay una mejor manera
Al utilizar la construcción [^]
, ha creado una clase de caracteres negados, que coincide con todos los caracteres excepto los que ha nombrado. El orden de los caracteres en la coincidencia candidata no importa, por lo que esto fallará en cualquier cadena que tenga cualquiera de [(/.config)
(o [)gi./onc(]
)
Use lookahead negativo, (con expresiones regulares de perl) así: (?!/.config$)
. Esto coincidirá con todas las cadenas que no coincidan con el literal ".config"
Como ha pedido una "mejor manera": probaría un enfoque de "filtrado". Creo que es bastante fácil de leer y entender:
#!/usr/bin/perl
while(<>) {
next if //.config$/; # ignore the line if it ends with ".config"
print;
}
Como puede ver, he usado el código perl como ejemplo. Pero creo que entiendes la idea?
añadido : este enfoque también podría utilizarse para encadenar más patrones de filtro y aún así se puede leer y es fácil de entender,
next if //.config$/; # ignore the line if it ends with ".config"
next if //.ini$/; # ignore the line if it ends with ".ini"
next if //.reg$/; # ignore the line if it ends with ".reg"
# now we have filtered out all the lines we want to skip
... process only the lines we want to use ...
Puede utilizar el aspecto negativo detrás de , por ejemplo:
.*(?<!/.config)$
Esto coincide con todas las cadenas excepto aquellas que terminan con ".config"
Su pregunta contiene dos preguntas, así que aquí hay algunas respuestas.
Haga coincidir las líneas que no contienen una cadena determinada (por ejemplo, .config
):
^(?:(?!/.config).)*$/r?/n?
Unir líneas que no terminan en una cadena determinada:
^.*(?<!/.config)$/r?/n?
y, como bonificación: une líneas que no comiencen con una cadena determinada:
^(?!/.config).*$/r?/n?
(cada vez incluyendo caracteres de nueva línea, si están presentes).
Ah, y para responder por qué su versión no funciona: [^abc]
significa "cualquier carácter (1) excepto a, b o c". Su otra solución también fallaría en test.hg
(porque también termina en la letra g: su expresión regular analiza cada carácter individualmente en lugar de toda la cadena .config
. Es por eso que necesita una solución para manejar esto.
Utilicé Regexpal antes de encontrar esta página y se me ocurrió la siguiente solución cuando quise comprobar que una cadena no contiene una extensión de archivo:
^(.(?!/.[a-zA-Z0-9]{3,}))*$
así que para encontrar una cadena que no contenga otra "^(.(?!" +
expresión que no quieres + "))*$"
(?<!/.config)$
:)