solo regulares regular que probar numeros mayores letras expresiones expresion especiales espacios espacio ejemplos direccion casa caracteres blanco alfanumerico regex

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:

  1. nada.
  2. un personaje
  3. cualquier personaje excepto 1 y seguido por cualquier otro personaje.
  4. tres o más personajes
  5. ya sea 10 .. 19 tenga en cuenta que 16 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.