Mis expresiones regulares favoritas

tatai

A raíz de mi post anterior sobre 5 expresiones regulares que todo programador web debería conocer, me ha parecido interesante añadir unas cuantas más que, aunque quizás no sean nada del otro mundo, me parecen muy útiles y seguro que ayudan a más de uno.

Validar un número entero

Esta es realmente sencilla y muy muy útil, sobre todo si trabajar con cadenas de texto o lenguajes de programación no tipados. En PHP hay por ejemplo funciones como is_number() que hacen una función parecida.

Comprueba si todos caracteres del string son dígitos.

/^\d+$/

O, de forma equivalente:

/^[0-9]+$/

Atentos que la cadena vacía no pasa esta expresión, es necesario que haya al menos un dígito. Si quieres permitir que esté vacío, entonces cambia el + por *.

Validar un número decimal

Esta es una extensión la anterior. Acepta tanto número positivos como negativos y que el separador de decimales sea coma o punto:

/^-?[0-9]+([,\.][0-9]*)?$/

Validar opciones de entrada

Aunque no siempre, viene muy bien cuando tenemos unos cuantos parámetros y no queremos usar if($a == ‘a’ || $a == ‘b’ || $a == ‘c’) y todo lo largo que queráis el if.

La siguiente expresión comprueba si la variable es a,  b, c, otro o mas:

/^(a|b|c|otro|mas)$/

En PHP, con un preg_match, la papeleta está solucionada. Por ejemplo:

if(!preg_match('/^(a|b|c|otro|mas)$/', $a) {
  // Si entra es que no hay coincidencias
  return null;
}

Tras estas líneas, $a es sólo una de las opciones indicada y si no, habrá retornado null.

Extraer cierta parte de un texto

Partiendo de que tenemos una cadena de caracteres en $text y sabemos que en alguna parte suya cumple que tiene una cadena de texto (por ejemplo ‘jugador’) y un número separados por un guión (es decir, por ejemplo ‘jugador-15′) y queremos conocer ese número porque es su identificador. Podemos usar:

preg_match('/player-(\d+)/', $text, $matches);
$id = $matches[1];

Tras estas líneas, en $id tenemos nuestro número.

Esta expresión se puede extender todavía un poco más si el texto a buscar lo tenemos en una variable, por ejemplo $buscar.

En PHP podemos hacer:

preg_match('/' . $buscar . '-(\d+)/', $text, $matches);
$id = $matches[1];

Si estás usando javascript, el equivalente para este último caso es:

var buscar = 'player';
var m = texto.match(new RegExp(buscar + '-(\d+)'));
var id = m[1];

Y hasta aquí da mi memoria de momento. Cuando me acuerde de alguna otra, ya las iremos posteando.


¿Te ha parecido útil este post? Puedes ayudarme con unas monedillas usando dropcoin

7 Responses to “Mis expresiones regulares favoritas”

  • 5 expresiones regulares que todo programador web debería conocer | Nos pasa algo lo mismo Says:

    […] Update: ya tengo mi propio post sobre expresiones regulares […]

  • Jorge Says:

    Y cómo haría para que no me permita el ingreso de un numero seguido sólo por punto o coma por ejemplo:
    15.
    233,

  • tatai Says:

    Hola Jorge,

    Yo forzaría que hubiese más números:

    [0-9]+[,\.][0-9]+

    Es decir, se leería: un número de al menos un dígito, luego coma o punto y luego un número de al menos un dígito.

    Espero que te sirva

  • Jorge Luis Says:

    Hola disculpa como se podría hacer una expresión para que no me acepte los 0 y -1 SOLO pueda aceptar cantidades así ejemplo: 1 o un 10

  • tatai Says:

    Hola Jorge, si te entiendo bien, quieres que sólo se aceptan números positivos y no se incluya el cero. Si es así, con algo del estilo /^[^0][0-9]*$/, es decir, que el primer dígito no sea cero, lo que excluye el menos también y luego la cantidad de dígitos que hagan falta.

    No obstante, una buena solución sería convertir la cadena a entero y a partir de aquí, hacer la comprobación > 0

  • Jorge Luis Says:

    Si es lo que quiero Tatai aun no encontrado una buena solucion eh logrado que no acepte los 0 ni los -1. Pero solo que no eh podido hacer que me acepte despues del primer digito el 0 es decir el 10, 20 etc.

  • Jorge Luis Says:

    Si cuentan con alguna funcion en javascript o exprecion regular que me sirva les agredeceria mucho

Leave a Reply