regulares parametros expresiones ejemplos comando regex path

regex - parametros - expresiones regulares linux



¿Cuál es la expresión regular más correcta para una ruta de archivo UNIX? (6)

¿Cuál es la expresión regular más correcta (regex) para una ruta de archivo UNIX?

Por ejemplo, para detectar algo como esto:

/usr/lib/libgccpp.so.1.0.2

Es bastante fácil crear una expresión regular que coincida con la mayoría de los archivos, pero cuál es la mejor, incluida una que puede detectar secuencias de espacio en blanco escapadas, y caracteres inusuales que no suele encontrar en las rutas de archivos en UNIX.

Además, ¿hay funciones de biblioteca en varios lenguajes de programación diferentes que proporcionan una ruta de archivo regex?


^(/)?([^//0]+(/)?)+$

Esto aceptará todos los caminos que sean legales en sistemas de archivos como extX , reiserfs .

Descarta solo los nombres de ruta que contienen el NUL o barras dobles (o más). Todo lo demás según las especificaciones de Unix debería ser legal (estoy sorprendido con este resultado también).


La expresión regular adecuada para hacer coincidir todas las rutas UNIX es: [^ / 0] +

Es decir, uno o más caracteres que no son NUL.


No estoy seguro de cuán común es una verificación de expresiones regulares para esto a través de los sistemas, pero la mayoría de los lenguajes de programación (especialmente los de plataformas cruzadas) proporcionan un control de "archivo existe" que tendrá en cuenta este tipo de cosas.

Por curiosidad, ¿dónde se están introduciendo estos caminos? ¿Podrías controlar eso a un grado mayor hasta el punto en que no tendrás que verificar las piezas individuales de la ruta? Por ejemplo, utilizando un cuadro de diálogo selector de archivos?


Si no te molestan los falsos positivos para identificar rutas, entonces solo necesitas asegurarte de que la ruta no contenga un carácter NUL ; todo lo demás está permitido (en particular, / es el carácter separador de nombre). El mejor enfoque sería resolver la ruta dada utilizando la función de archivo IO adecuada (por ejemplo, File.exists() , File.getCanonicalFile() en Java).

Respuesta larga:

Esto depende del sistema operativo y del sistema de archivos . Por ejemplo, la comparación de sistemas de archivos de Wikipedia observa que, además de los límites impuestos por el sistema de archivos,

MS-DOS, Microsoft Windows y OS / 2 no permiten los caracteres / / : ? * " > < | / / : ? * " > < | y NUL en nombres de archivos y directorios en todos los sistemas de archivos . Unices y Linux no permiten los caracteres / y NUL en nombres de archivos y directorios en todos los sistemas de archivos .

En Windows, los siguientes nombres de dispositivos reservados tampoco están permitidos como nombres de archivo:

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9


Para otros que han respondido a esta pregunta, es importante tener en cuenta que algunas aplicaciones requerirían una expresión regular ligeramente diferente, según cómo funcionen los caracteres de escape en el programa que está escribiendo. Si estuvieras escribiendo un intérprete de comandos, por ejemplo, y quisieras tener un comando separado por espacios y otros caracteres especiales, tendrías que modificar tu expresión regular para incluir solo las palabras con caracteres especiales si esos caracteres están escapados.

Entonces, por ejemplo, una ruta válida sería

/usr/bin/program/ with/ space

Opuesto a

/usr/bin/program with space

que se referiría a "/ usr / bin / program" con argumentos "con" y "espacio"

Una expresión regular para el ejemplo anterior podría ser "([^ / 0] / | //) *"

La expresión regular en la que he estado trabajando es (nueva línea separada para ''legibilidad''):

"/( # Either [^/0 !$`&*()+] # A normal (non-special) character /| # Or ///(/ |/!|/$|/`|/&|/*|/(|/)|/+/) # An escaped special character /)/+" # Repeated >= 1 times

Lo que se traduce a

"/([^/0 !$`&*()+]/|///(/ |/!|/$|/`|/&|/*|/(|/)|/+/)/)/+"

Crear tu propia expresión regular específica también debería ser relativamente simple.


Pregunta ya respondida aquí: https://.com/a/42036026/1951947