Pregunta

Busco a una expresión regular que coincidirá con cualquier número del 1 al 50 inclusive. Hasta el momento, he encontrado ejemplos, pero todos ellos permitirá a la cadena contiene un punto decimal, que no quiero incluir. Así 1,13,24,50 están bien, pero 1., etc no lo son. ¿Hay una expresión regular que puedo usar?

Gracias de antemano, Tim

¿Fue útil?

Solución

Prueba esto:

/^(?:[1-9]|[1-4][0-9]|50)$/

UPDATE:

Ahora que veo la pregunta ha sido actualizado para referirse a MySQL, esto cambia las cosas de manera significativa. La expresión regular mencionado anteriormente utiliza parens no captura que no están soportadas por MySQL. Pero también plantea la pregunta; en caso de que realmente a utilizar expresiones regulares para resolver este problema? Realmente tenemos que ver cómo se está almacenando sus números que debe estar entre 1 y 50. ¿Son varchars? ¿Son ints? Voy a demostrar cómo resolver las dos cosas. En primer lugar voy a configurar una tabla de prueba con índices:

create table regextest (
    id int unsigned primary key auto_increment,
    varchar_number varchar(5) not null,
    int_number int not null,
    index(varchar_number),
    index(int_number)
) engine=innodb;

Ahora poner algunos datos de prueba en ella asegurándose de que todos nuestros casos extremos están cubiertos:

insert into regextest (varchar_number, int_number)
    values ('0', 0), ('1', 1), ('35', 35), ('49', 49), ('50', 50), ('51', 51);

Y ahora, aquí es una consulta que va a resolver su problema asumiendo que sus números se almacenan como cadenas en la columna de la varchar_number:

mysql> select * from regextest where varchar_number rlike '^([1-9]|[1-4][0-9]|50)$';
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
|  2 | 1              |          1 |
|  3 | 35             |         35 |
|  4 | 49             |         49 |
|  5 | 50             |         50 |
+----+----------------+------------+
4 rows in set (0.00 sec)

esto funciona, pero se llevará a cabo mal en grandes conjuntos de datos porque no puede utilizar un índice incluso si uno está presente. MySQL debe ejecutar la expresión regular una vez por cada fila de la tabla. Supongamos que los números entre 1 y 50 se almacenan como ints en la columna de la int_number. Usted simplemente puede hacer esto:

mysql> select * from regextest where int_number between 1 and 50;
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
|  2 | 1              |          1 |
|  3 | 35             |         35 |
|  4 | 49             |         49 |
|  5 | 50             |         50 |
+----+----------------+------------+
4 rows in set (0.00 sec)

Esta consulta tenga un buen rendimiento, ya que puede utilizar un índice y también es más fácil de leer y más fácil de mantener. Gana todo.

Otros consejos

'^(0?\d|[1-4]\d|50)$'

Esto es:

  • El inicio de la entrada
  • seguido de un solo dígito (opcional precedido por un 0), o
  • seguido de un 1-4 seguido de cualquier dígito, o
  • seguido de 50
  • y asegúrese de que vemos el final de la entrada.

Editar Lo anterior permite a 0 (y 00), que seguramente no desea. Así, suponiendo que realmente no quería ceros a la izquierda permite de todas maneras:

'^([1-9]|[1-4]\d|50)$'

Editar:. A medida que los comentarios posteriores de la OP indican que esto es para MySQL, he cambiado la sintaxis para especificar el patrón

^ ([1-9] | [1-4] [0-9] | 50) $

intente éste

([0-4]{1}[0-9]{0,1}[.]{0,1}[0-9]{0,2}|50)

A continuación va a hacer

45.00 - Match
4     - Match
78    - Not Match
51    - Not Match
21.25 - Match

"trampa" con Perl6 :: Reglas :

/ ( \d+ ) { 1 <= $1 && $1 <= 50 or fail } /

O en Perl 5.10 y arriba,

/(\d+)(?(?{1>$1||50<$1})(*FAIL))/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top