Expresión regular para cualquier número mayor que 0? [cerrado]


Aplicando validación a un modelo en MVC y quisiera hacerlo usando Regex.

Buscando validar que un ID en mi modelo es mayor que 0 al enviar.

Author: Mel, 2012-01-27

14 answers

No se como MVC es relevante, pero si tu ID es un entero, este BRE debería hacer:

    ^[1-9][0-9]*$

Si desea hacer coincidir números reales (flotadores) en lugar de enteros, debe manejar el caso anterior, junto con los números decimales normales (es decir, 2.5 o 3.3̅), los casos en los que su patrón está entre 0 y 1 (es decir, 0.25), así como el caso en el que su patrón tiene una parte decimal que es 0. (es decir, 2.0). Y mientras estamos en ello, agregaremos soporte para ceros a la izquierda en enteros (i. e. 005):

    ^(0*[1-9][0-9]*(\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$

Tenga en cuenta que este segundo es un RE Extendido. Lo mismo se puede expresar en RE Básico, pero casi todo lo entiende these en estos días. Dividamos la expresión en partes que sean más fáciles de digerir.

    ^(

El caret coincide con el null al principio de la línea, por lo que precede a su expresión regular con un caret lo ancla al principio de la línea. El paréntesis de apertura está ahí debido a la barra de or, abajo. Más sobre eso tarde.

      0*[1-9][0-9]*(\.[0-9]+)?

Esto coincide con cualquier entero o cualquier número de coma flotante por encima de 1. Así que nuestro 2.0 sería igual, pero 0.25 no. El 0* al inicio maneja ceros a la izquierda, así que 005 == 5.

                              |

El carácter pipe es un "or-bar" en este contexto. Para propósitos de evaluación de esta expresión, tiene mayor precedencia que todo lo demás, y efectivamente une dos expresiones regulares juntas. Los paréntesis se utilizan para agrupar múltiples expresiones separadas por barras or.

Y la segunda parte:

                               0+\.[0-9]*[1-9][0-9]*

Coincide con cualquier número que comience con uno o más caracteres 0 (reemplace + con * para que coincida con cero o más ceros, es decir, .25), seguido de un punto, seguido de una cadena de dígitos que incluya al menos uno que no sea un 0. Así que esto coincide con todo por encima 0 y por debajo 1.

                                                    )$

Y finalmente, cerramos los paréntesis y anclamos la expresión regular al final de la línea con el signo del dólar, al igual que el cuadro se ancla al principio de la línea.

Por supuesto, si dejas que tu lenguaje de programación evalúe algo numéricamente en lugar de intentar compararlo con una expresión regular, ahorrarás dolores de cabeza y CPU.

 114
Author: ghoti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-29 14:46:47

Y esto: ^[1-9][0-9]*$

 12
Author: cwharris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-29 16:45:23
 3
Author: Eduardo Cuomo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-30 20:44:09

Si solo desea números enteros no negativos, intente: ^\d+$

 2
Author: Uila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-23 19:03:40

Creo que la mejor solución es agregar el signo + entre los dos corchetes de la expresión regex:

^[1-9]+[0-9]*$
 2
Author: Zaher Abou Shakra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-14 16:04:16

Otra solución:

^[1-9]\d*$

\d equivalente a [0-9]

 2
Author: foxiris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-04 09:57:39

Ahí tienes:

MatchCollection myMatches = Regex.Matches(yourstring, @"[1-9][0-9]*");

En presentar:

if(myMatches.Count > 0)
{
   //do whatever you want
}
 1
Author: SolidSnake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-27 19:08:43

Probé este y funcionó para mí para todos los números decimales/enteros mayores que cero

Permite espacios en blanco: ^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

Sin espacios en blanco: ^(?=.*[1-9])\d*(?:\.\d{1,2})?$

Referencia: Expresión regular mayor que cero con 2 decimales

 1
Author: Muhammad Omar ElShourbagy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:46

Puede usar la siguiente expresión:

(^\d*\.?\d*[1-9]+\d*$)|(^[1-9]+\.?\d*$)                  

Entradas válidas: 1 1. 1.1 1.0 todos los números reales positivos

Entradas no válidas: todos los números reales negativos y 0 y 0.0

 0
Author: user3571880,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-25 07:35:09

La respuesta simple es: ^[1-9][0-9]*$

 0
Author: Md. Rousonur Jaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-14 10:18:30

Simplificado solo para 2 decimales.

^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

Ref: https://www.regextester.com/94470

 0
Author: Nikhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-23 19:55:51

Creo que esto funcionaría perfectamente:

([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9])

Válido:

 1
 1.2
 1.02
 0.1 
 0.02

No válido:

0
01
01.2
1.10
 -2
Author: Zota DRAGOS PETRISOR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-21 23:34:52
[1-9]\.\d{1,2}|0\.((0?[1-9])|([1-9]0?)){1,2}\b
 -2
Author: Choo Hwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-21 19:27:40

Respuesta muy simple para esto use esto: \d *

 -7
Author: Suhail Akhtar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-14 15:25:49