Articles

Like vs Match: La batalla de los operadores de comparación de Powershell

Powershell ofrece unas cuantas formas diferentes de ver si una cadena está dentro de otra cadena. El método más común es utilizar los operadores Like y Match. Estos dos operadores pueden parecer similares en su funcionalidad pero, bajo el capó, son dos bestias muy diferentes. Repasemos cada uno de ellos para ver cuál ganaría una batalla campal. Haremos dos rondas, con el siguiente sistema de puntuación: un punto por la velocidad y otro por la facilidad de sintaxis. Para obtener una comparación real de ambos operadores, utilizaremos el texto completo del libro «Guerra y Paz», de León Tolstoi. Para obtener el texto de este libro en una cadena estoy utilizando el cmdlet Get-Content con el parámetro -Raw, que asigna las 1.440 páginas de contenido en una sola cadena en lugar de un array. $WarAndPeaceString = Get-Content C:\WarAndPeace.txt -Raw La competencia será ver si el texto de la novela «Guerra y Paz» contiene la palabra «waldo» al final de una frase, por lo que la cadena será «waldo». Antes de que comience esta lucha a muerte, es importante dar una breve explicación de un operador de Powershell. A continuación, echaremos un vistazo a cada uno de nuestros contendientes; queremos recordar al oponente perdedor o, al menos, al pariente más cercano para notificar cuando se acabe.

Una breve explicación de los operadores de comparación de Powershell

Like y Match son ambos operadores de Powershell; más específicamente, son operadores de comparación. En su forma más básica, los operadores de comparación se utilizan para comparar valores y devolver un valor booleano Verdadero o Falso. Sin embargo, este artículo se centrará en el uso de los operadores Like y Match para encontrar una cadena dentro de otra cadena. Ambos de nuestros contendientes pueden hacer esto, pero cada uno realiza la tarea de una manera ligeramente diferente.

Conozca el operador Like

El operador Like es un operador de comparación de Powershell que utiliza comodines. Un ejemplo muy sencillo para encontrar la palabra «day» en la cadena, «It is a great day,: sería algo así: PS> 'it is a great day' -like '*day*' Esta sentencia devolvería un valor True. Sin embargo, si hago algo como esto, devolvería un valor FalsePS> 'it is a great day' -like 'day' ¿Por qué la diferencia? Observe los asteriscos que rodean a day en el primer ejemplo. Son comodines que deben estar presentes para representar cualquier tipo de texto a ambos lados de la palabra day. En lenguaje llano, la primera afirmación está diciendo básicamente: «¿Tiene la cadena ‘es un gran día’ la palabra ‘día’ dentro de ella, con cualquier texto a la izquierda o a la derecha?» Mientras tanto, la segunda afirmación dice: «¿Tiene la cadena ‘es un gran día’ la palabra ‘día’ dentro, pero sin texto a la izquierda y a la derecha?» El operador Like funciona bien para una coincidencia simple como ésta cuando se tiene una cadena simple sin caracteres especiales, y cuando se sabe exactamente qué cadena se está buscando.

Conozca el operador Match

El operador Match es otro operador de comparación de Powershell. Aunque es similar a Like, es mucho más Powershell (aunque un poco más complicado). El operador Match utiliza expresiones regulares (regex). Esto es un enorme beneficio y le da a Match una ventaja definitiva sobre Like. Sin embargo, si nunca has utilizado expresiones regulares, prepárate. Un compañero de trabajo, al describir las expresiones regulares, dijo una vez: «Quien creó las expresiones regulares tenía que estar drogado». Esto no podría ser más cierto. Volvamos a nuestra cadena de ejemplo anterior. PS> 'it is a great day' -match '*day*' Acabo de sustituir la palabra like por match. ¿Qué crees que pasaría? Devolvería True, como nuestro ejemplo anterior, o algo más? regexfailure Puedes ver que funciona de forma diferente a Like. No estás trabajando con un simple texto. Has entrado en el reino de las regex, y las cosas no son iguales en el mundo de las regex. Para que esto funcione correctamente con el operador Match tendrías que quitar los asteriscos, porque los asteriscos tienen un significado especial en el mundo regex. PS> 'it is a great day' -match 'day' El operador Match puede hacer mucho más que simples coincidencias como ésta, pero para esta batalla intentaré hacerlo justo comparando sólo atributos similares. Con los antecedentes fuera del camino, vayamos al grano.

Ronda nº 1: Like vs. Match: ¿Cuál es más rápido?

Como Vamos a ver si el operador like puede averiguar si nuestra cadena de ejemplo contiene «waldo», y lo rápido que fue. waldolikeresultado ¡Muy rápido! El operador Like fue capaz de encontrar la coincidencia en unos 149 milisegundos. Coincidencia Ahora traigamos el operador Coincidencia y veamos cómo se apila. waldomatchresultado El ganador aquí está claro; ¡un punto para el operador Match! Como: 0, Match: 1

Ronda nº 2: Like vs. Match: Facilidad sintáctica

Para que esta ronda sea lo más igualada posible voy a definir «facilidad sintáctica» como el operador más fácil de entender y que requiere menos caracteres. Como primero, el operador Like. PS> $WarAndPeaceString -like '*waldo.*' No está nada mal con ocho caracteres, pero requiere recordar los asteriscos a cada lado de nuestra cadena de búsqueda. Match A continuación, el operador Match entra en el ring y nos muestra de qué está hecho. PS> $WarAndPeaceString -match 'waldo\.' No veo asteriscos aquí, así que el número de caracteres es sólo siete. Sin embargo, ¿qué hace esa barra invertida ahí? Eso es extremadamente confuso. Dado que el operador de coincidencia utiliza regex, éste requiere que se escapen ciertos caracteres especiales en la cadena de búsqueda. Eso es demasiado extraño para un recién llegado, así que le estoy dando a Like el punto aquí. Como: 1, Match: 1 Desde nuestra batalla puramente lúdica parece que los operadores Like y Match están igualados. Aunque esto puede o no ser la realidad actual, espero que hayas obtenido una buena demostración de lo que puede hacer cada operador, junto con un poco sobre las diferencias de sintaxis.

Dejar una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *