regex - regulares - Necesita una expresión regular para excluir ciertas cadenas
expresiones regulares ejemplos (6)
A veces es más fácil usar dos expresiones regulares. Primero busca todo lo que quieras, luego ignora todo lo que no quieres. Hago esto todo el tiempo en la línea de comandos donde canalizo una expresión regular que obtiene un superconjunto en otra expresión regular que ignora cosas que no quiero.
Si el objetivo es hacer el trabajo en lugar de encontrar la expresión regular perfecta, considere ese enfoque. A menudo es mucho más fácil escribir y comprender que una expresión regular que hace uso de características exóticas.
Estoy tratando de obtener una expresión regular que coincida:
somefile_1.txt
somefile_2.txt
somefile_{anything}.txt
pero no coincide:
somefile_16.txt
Lo intenté
somefile_[^(16)].txt
sin suerte (incluye incluso el registro "16")
La mejor solución ya ha sido mencionada:
somefile_(?!16/.txt$).*/.txt
Esto funciona, y es lo suficientemente codicioso como para llevar todo lo que viene en la misma línea. Sin embargo, si sabes que quieres un nombre de archivo válido, te sugiero que también limites los caracteres no válidos:
somefile_(?!16)[^?%*:|"<>]*/.txt
Si está trabajando con un motor de expresiones regulares que no admite búsquedas anticipadas, tendrá que considerar cómo recuperarlo. Puede dividir archivos en dos grupos, aquellos que comienzan con 1, y no son seguidos por 6, y los que comienzan con cualquier otra cosa:
somefile_(1[^6]|[^1]).*/.txt
Si desea permitir somefile_16_stuff.txt pero NO somefile_16.txt, estas expresiones regexuales anteriores no son suficientes. Deberá establecer su límite de manera diferente:
somefile_(16.|1[^6]|[^1]).*/.txt
Combine todo esto y obtendrá dos posibilidades, una que bloquea la instancia única (somefile_16.txt) y otra que bloquea todas las familias (somefile_16 * .txt). Personalmente creo que prefieres el primero:
somefile_((16[^?%*:|"<>]|1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)/.txt
somefile_((1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)/.txt
En la versión sin eliminar caracteres especiales, es más fácil de leer:
somefile_((16.|1[^6]|[^1).*|1)/.txt
somefile_((1[^6]|[^1]).*|1)/.txt
Para obedecer estrictamente sus especificaciones y ser exigente, debería usar:
^somefile_(?!16/.txt$).*/.txt$
para que se pueda emparejar somefile_1666.txt que es {cualquier cosa};
pero a veces es más fácil de usar ...
ls | grep -e ''somefile_.*/.txt'' | grep -v -e ''somefile_16/.txt''
Sin usar lookahead
somefile_(|.|[^1].+|10|11|12|13|14|15|17|18|19|.{3,}).txt
Léalo como: somefile_
seguido de:
- nada.
- un personaje
- cualquier personaje excepto
1
y seguido por cualquier otro personaje. - tres o más personajes
- ya sea
10
..19
tenga en cuenta que16
ha quedado fuera.
y finalmente seguido por .txt
.
somefile_(?!16).*/.txt
(?! 16) significa: afirme que es imposible hacer coincidir la expresión regular "16" comenzando en esa posición.
Algunas bibliotecas de expresiones regulares permiten la búsqueda anticipada:
somefile(?!16/.txt$).*?/.txt
De lo contrario, todavía puede usar múltiples clases de caracteres:
somefile([^1].|1[^6]|.|.{3,})/.txt
o, para lograr la máxima portabilidad:
somefile([^1].|1[^6]|.|....*)/.txt
[^(16)]
significa: unir cualquier caracter excepto llaves, 1 y 6.