2009-08-06 15 views
6

Estoy intentando crear una expresión regular que aceptará los siguientes valores:una expresión regular que va a analizar 00.00

  • (en blanco)
  • 00,0
  • 00,00

Se me ocurrió ([0-9]){0,2}\.([0-9]){0,2} que me dice "los dígitos del 0 al 9 que aparecen 0 a 2 veces, seguido de un '.' carácter (que debería ser opcional), seguido de los dígitos 0 a 9 que ocurren de 0 a 2 veces. Si solo se ingresan 2 dígitos, el '.' no es necesario ¿Qué pasa con esta expresión regular

+0

¿Cómo está fallando? Aparte del hecho de que el '.' no es opcional, como señala Joachim, todo lo que puedo ver es que es demasiado permisivo (por ejemplo, permite 00. y .00). Además, ¿qué idioma estás usando? – Beta

Respuesta

15

usted no ha realizado el punto opcional:.?.

[0-9]{0,2}(\.[0-9]{1,2})? 
+0

¡Perfecto! Gracias. –

+0

Eso también coincidirá con '.0'. ¿Está bien? Si no, debe cambiar la primera parte a '[0-9] {1,2}'. Eso a su vez provocará que (blanco) falle. Podrías resolver ese problema envolviendo todo en (...)? pero probablemente tenga más sentido buscar (en blanco) por separado. –

+3

Una advertencia: esta expresión regular coincidirá con cualquier cosa porque todas las partes son opcionales. Si le pide que coincida con "a", tendrá éxito porque coincide con el espacio vacío "antes de la a". Tal vez deberías anclar la expresión regular con^y $ (ya que quieres hacer coincidir una cadena vacía). –

3

En primer lugar, {0-2} debería haber {0,2} como lo fue en el primer caso

segundo , necesita agrupar las secciones de repetición también.

En tercer lugar, debe hacer que la última parte sea opcional. Porque si hay un punto, debe haber algo después, también debe cambiar la segunda repetición a {1,2}.

([0-9]{0,2})(\.([0-9]{1,2}))? 
2

Hay algunos problemas con su expresión regular:

  1. del punto es un carácter especial, y actúa como un comodín; si quieres un punto literal, necesitas escaparlo (\.).
  2. Incluso si reemplazó el punto para que no sea un comodín, su expresión regular coincidirá con cadenas como "0". porque no le dijiste al motor de expresiones regulares que solo coincida con el punto si hay números que lo siguen.
  3. Como su expresión no es anchored, podría coincidir cadenas que contengan el patrón dentro de otra palabra, por ejemplo (es decir, ab12 coincidiría).

Un patrón mejor sería algo así como:

/\b[0-9]{0,2}(?:\.[0-9]{1,2})?\b/ 

Tenga en cuenta que (?:...) hace que el grupo no crea una referencia hacia atrás, que probablemente no se necesita en su caso.

1

Aquí hay una manera, ilustrada en Perl, para que coincida con solo las cadenas que enumeró. La parte importante es su método para hacer coincidir cadenas vacías: no hace que cada elemento de patrón sea opcional, una estrategia que tiene el efecto indeseable de emparejar casi todas las cadenas.

use warnings; 
use strict; 

my @data = (
    '', 
    '0', 
    '00', 
    '00.0', 
    '00.00', 
    'foo', # Should not match. 
    '.0',  # Should not match. 
); 

for (@data){ 
    print $_, "\n" if /^$|^[0-9]{1,2}(\.[0-9]{1,2})?$/; 
} 
0

mayoría de los ejemplos anteriores no anclar el principio ^ y terminando $ de los datos.

lo resolvería con uno de los siguientes:

  • ^[[:digit:]]{0,2}([.][[:digit:]]{1,2})$
  • ^\d{0,2}([.]\d{1,2})$
  • ^[0-9]{0,2}([.][0-9]{1,2})$

Para facilitar la lectura, por lo general prefiero usar [.]-\. y el uso de clases POSIX como [[:digit:]].

Cuestiones relacionadas