Ayuda con expresión regular

Iniciado por betopuck, 3 Octubre 2017, 16:38 PM

0 Miembros y 1 Visitante están viendo este tema.

betopuck

Hola

Tengo estas rutas:

PhysicalDisk\0 C:\% Disk Write Time
PhysicalDisk\1 D:\% Disk Write Time
PhysicalDisk\2 E:\% Disk Write Time

PhysicalDisk\_Total\% Disk Write Time

De las cuales necesito crear una expresión regular para excluir "_Total".

La siguiente expresión me manda todo:

/PhysicalDisk\\.*[a-z0-9-].*\\% Disk Write Time/

Pero cuando intento excluir a "_Total" con lo siguiente no me resulta:

/PhysicalDisk\\.*(?!_Total|[a-z0-9-].*).*\\% Disk Write Time/

¿Logran visualizar algún error ?

Gracias


ivancea96

QUé tal este:
/PhysicalDisk\\(?!_Total\\).*[a-z0-9-].*\\% Disk Write Time/

Simplemente, que busque los caracteres como en tu primera expresión, solo que si encuentra un "_Total\" de primeras, no sirve. (La \ espara evitar que falle un fragmento que tan solo empiece por "_Total", como: PhysicalDisk\_Total sd\% Disk Write Time. Si quieres que esto también falle, basta quitarle el "\".

Serapis

Simplifícalo...
Si todas las rutas 'requeridas' empiezan por un número, pués queda bastante claro

/PhysicalDisk\\[0-9].*\\% Disk Write Time/

Eleкtro

#3
Cita de: betopuck en  3 Octubre 2017, 16:38 PMPero cuando intento excluir a "_Total" con lo siguiente no me resulta:

¿Logran visualizar algún error ?

Hola.

Al formular una pregunta relacionada con la programación, empieza por especificar en qué lenguaje de programación estás construyendo esa expresión regular.

La sintaxis de una expresión regular no es algo universal, aunque una expresión "simple" va a funcionar en cualquier lenguaje, pero cada lenguaje de programación tiene su motor de RegEx con sus propias reglas sintácticas y semánticas para muchas cosas, que vuelve incompatible una expresión regular construida bajo las reglas de cierto lenguaje/motor, con el de otro diferente.

Basicamente la respuesta a la pregunta "¿cómo excluir una palabra de la captura?" y si el motor RegEx del lenguaje que uses te lo permite, sería construir una expresión de vista negativa (o Negative Lookahead por su nombre en Inglés).
Aquí tienes info al respecto y para diferentes lenguajes:

En C# / VB.NET la solución se aplicaría mediante esta sintaxis:
"PhysicalDisk\\(?!_Total).+\\.+"

De todas formas lo más simple sería seguir la solución alternativa propuesta por @NEBIRE:
Cita de: NEBIRE en  4 Octubre 2017, 16:50 PM
Simplifícalo...
Si todas las rutas 'requeridas' empiezan por un número, pués queda bastante claro

/PhysicalDisk\\[0-9].*\\% Disk Write Time/

Y ya puestos, todavía algo más simplificado sería tal que así:
PhysicalDisk\\\d.+\\.+

O incluso:
[a-zA-Z]+\\\d.+

O reducido al máximo:
.+\\\d.+

Cualquiera de esas expresiones están libres de falsos positivos siempre y cuando las cadenas de texto a analizar tengan el mismo formato que has descrito al principio. Todo depende de lo que realmente necesites, pero no es estrictamente necesario recurrir a un lookahead negativo.

Nota: El metacaracter "\d" por lo general solamente captura dígitos del 0 al 9, pero según el lenguaje de programación en el que se aplique tiene un comportamiento diferente (captura distintos caracteres).

Nota 2: En varios lenguajes de programación puedes simplificar el patrón de captura de caracteres alfabéticos en minúscula y mayúscula "[a-zA-Z]" por: "[A-z]" (nótese primero una "A" MAYÚSCULA seguido de "z" minúscula, no al revés).

Saludos.








ivancea96

Cita de: Eleкtro en  4 Octubre 2017, 17:40 PM
En varios lenguajes de programación puedes simplificar el patrón de captura de caracteres alfabéticos en minúscula y mayúscula "[a-zA-Z]" por: "[A-z]" (nótese primero una "A" MAYÚSCULA seguido de "z" minúscula, no al revés).

[A-z] no hace lo que esperas. Entre la A y la z hay más caracteres que letras. No confundir con [A-Za-z].

Eleкtro

Cita de: ivancea96 en  4 Octubre 2017, 19:52 PM[A-z] no hace lo que esperas. Entre la A y la z hay más caracteres que letras. No confundir con [A-Za-z].

Soy consciente de que aparte de capturar cualquer caracter en minúscula en el rango "a" hasta "z", y cualquer caracter alfabético en mayúscula en el rango "A" hasta "Z", también capturará algunos símbolos como "[" y "]", pero eso no influye en la solución que proporcioné. De todas formas me parece correcto que lo hayas advertido.

Saludos