Búsqueda de sitios web

Compruebe si la cadena contiene un número en PowerShell [4 formas]


Usando expresiones regulares

Usamos expresiones regulares siempre que necesitamos buscar patrones específicos en el texto. Las expresiones regulares, también conocidas como regex, comprenden operadores, caracteres literales y otras construcciones. PowerShell cuenta con varios cmdlets y operadores que nos permiten utilizar expresiones regulares con ellos; algunos de ellos se dan a continuación:

  • Usando el operador -match
  • Usando el operador -split
  • Usando el cmdlet Select-String
  • Uso de la instrucción switch con la opción -Regex

También podemos usar el operador -like, pero no funciona con expresiones regulares. Veremos cómo utilizarlo en nuestro caso. Aprendamos cada uno de ellos a continuación.

Utilice el operador -match

Utilice el operador -match para comprobar si la cadena especificada contiene el número.

Utilice el operador -match:

$string = "It is a sample string containing 0123 numbers."

if ($string -match "\d+") {
    Write-Host "The string has number(s)."
}else{
    Write-Host "The string does not has number(s)."
}

PRODUCCIÓN :

The string has number(s).

Primero, definimos una variable llamada $string y la inicializamos con un valor de cadena que contiene un valor numérico. A continuación, utilizamos la instrucción if con el operador -match y una expresión regular (\d+) para comprobar si la $string contenía números y devolvía True si los contenía. Como resultado, la declaración if se volvió True, lo que ejecutó el bloque if; de lo contrario, se ejecutaría el bloque else. Finalmente, utilizamos el cmdlet Write-Host para mostrar un mensaje personalizado para informarle al usuario si el número se encuentra en $string.

Aquí, \d solo coincidirá con números que incluyan puntos decimales, independientemente de la posición del decimal, lo que significa 01.23, .0123 y . 0123. todo será detectado. Al mismo tiempo, + coincidiría con una o varias instancias de los números.

Utilice el operador -like

Utilice el operador -like para determinar si la cadena contiene el número.

Utilice el operador -like:

$string = "It is a sample string containing 0123 numbers."

if ($string -like "*[0-9]*") {
    Write-Host "The string has number(s)."
}else{
    Write-Host "The string does not has number(s)."
}

PRODUCCIÓN :

The string has number(s).

Este ejemplo es similar al anterior, pero utilizamos el operador -like, que no admite expresiones regulares. Aún así, podemos usar este operador para verificar si $string contiene el número usando la coincidencia de patrones. Aquí, el *[0-9]* coincidió con la cadena que contiene uno o varios números. El operador -like también devuelve True si se encuentra la coincidencia, lo que provoca la ejecución del bloque if; de lo contrario, se ejecutaría la parte else.

Utilice el operador -split

Para comprobar si la cadena contiene los números:

  • Defina una cadena con números.
  • Utilice el operador -split con la expresión regular \D+ para hacer coincidir uno o varios caracteres que no sean dígitos, lo que dará como resultado una matriz con secuencias de números.
  • Utilice el bucle foreach para iterar sobre la matriz que contiene secuencias de números que recibimos en el paso anterior.
  • En cada iteración:

    • Utilice la instrucción if con el operador -match y una expresión regular (\d+) para comprobar si contiene el número
    • Utilice el cmdlet Write-Host si se cumple la condición if y salga del bucle utilizando la instrucción break.

Utilice el operador -split:

$string = "It is a sample string containing 0123 numbers."
$elements = $string -split "\D+"

foreach ($element in $elements) {
    if ($element -match "\d+") {
        Write-Host "String contains a number."
        break
    }
}

PRODUCCIÓN :

The string has number(s).

Aquí, utilizamos el operador -split para dividir $string en una matriz de subcadenas. La división se basa en el delimitador especificado, \D+; solo coincide si se encuentran uno o varios caracteres consecutivos que no sean dígitos. Después de la operación de división, solo tendremos subcadenas que constan de dígitos, que guardamos en $elements.

A continuación, utilizamos la instrucción foreach para recorrer $elements. Luego, para cada iteración, usamos la declaración if con el operador -match y la expresión regular \d+ para verificar si contenía el número; esta declaración if es la misma que hicimos en el primer código de ejemplo. Finalmente, si se cumple la declaración if, usamos Write-Host para informar al usuario que $string tiene el número y la salida del bucle usando la instrucción break.

Ahora bien, ¿por qué salimos del circuito? Esto se debe a que solo debemos encontrar si $string tiene algún número; No nos preocupa cuántas veces encontramos la aparición del número. Por lo tanto, este bucle se escribirá en la consola de PowerShell una vez, incluso si hay varios dígitos en la cadena porque la instrucción break finalizará el bucle después de que se encuentre la primera coincidencia.

Utilice el cmdlet Select-String

Utilice el cmdlet Select-String para comprobar si la cadena contiene el número.

Utilice el cmdlet Seleccionar cadena:

$string = "It is a sample string containing 0123 numbers."
$output = Select-String -InputObject $string -Pattern "\d+"

if ($output) {
    Write-Host "The string has number(s)."
}else{
    Write-Host "The string does not has number(s)."
}

PRODUCCIÓN :

The string has number(s).

Primero, definimos e inicializamos la variable $string para contener un valor de tipo cadena. A continuación, utilizamos el cmdlet Select-String con los parámetros -InputObject y -Pattern para comprobar si el objeto de entrada contiene el patrón dado.

Ahora bien, ¿cuáles son los objetos y patrones de entrada? Aprendamos cómo comenzar con el cmdlet Select-String; se utiliza para buscar texto en archivos y cadenas. Este cmdlet admite expresiones regulares para buscar un patrón específico en la cadena o los archivos. Aquí, el patrón es \d+, que solo coincidirá con números, incluidos los puntos decimales, independientemente de la posición del decimal. Objeto de entrada significa la cadena de entrada o los archivos que especificamos usando el parámetro -InputObject.

El cmdlet Select-String devolvió True si se encontró la coincidencia; de lo contrario, Falso. Usamos este valor booleano con if; si es True, ejecute el bloque if; de lo contrario, el bloque else.

Ahora, da un paso adelante y prueba una solución más desafiante. Suponga una serie de cadenas donde cada elemento contendrá un número simple, un número de seguro social, un correo electrónico o sería simplemente un texto simple. Nuestro trabajo es iterar sobre cada elemento del conjunto de cadenas y verificar si contiene un número simple, un número de seguro social, un correo electrónico o ninguno de estos. También tenemos que abordar el caso de default. Todo esto se puede hacer con la siguiente solución. Sigamos con eso.

Utilice la instrucción switch con la opción -Regex

Para comprobar si la cadena tiene un número o cadena:

  • Utilice el operador de matriz (@()) para crear una matriz.
  • Utilice el bucle foreach para iterar sobre la matriz creada en el paso anterior.
  • En cada iteración:

    • Utilice la instrucción switch con la opción -Regex para hacer coincidir el caso e imprimir el mensaje.

Utilice la declaración de cambio con la opción -Regex:

$stringArray = @("This string has 123 as id.",
             "This string has 123-45-6789 as SSN.",
             "This string has john@gmail.com as an email.",
             "This is just a string")

foreach ($string in $stringArray) {

    switch -Regex ($string){
        "\b\d{3}-\d{2}-\d{4}\b"
            {Write-Host "This string has social security number";Break}
        "\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b"
            {Write-Host "This string has an email address";Break}
        "\b\d+\b"
            {Write-Host "This string has id number";Break}
        default
            {Write-Host "This pattern is something else"}
    }

}

PRODUCCIÓN :

This string has id number
This string has social security number
This string has an email address
This pattern is something else

Primero, utilizamos un operador de matriz representado con @() para crear una matriz con valores de tipo cadena y la almacenamos en la variable $stringArray. A continuación, utilizamos el bucle foreach para iterar sobre $stringArray y pasar cada $string a la instrucción switch. Finalmente, utilizamos la instrucción switch con la opción -Regex para trabajar con expresiones regulares.

Para cada iteración, la instrucción switch coincidió con el caso según la expresión regular proporcionada y mostró un mensaje usando el cmdlet Write-Host. Tenga en cuenta que utilizamos la instrucción Break para detener la instrucción switch tan pronto como se encontró la coincidencia. El caso default se ejecutará si no se encuentra ninguna coincidencia.

Artículos relacionados