2008-10-06 14 views
7

Estoy tratando de hacer coincidir los números decimales de punto flotante con una expresión regular. Puede haber o no un número antes del decimal, y el decimal puede o no estar presente, y si está presente puede o no tener dígitos después de él. (Para esta aplicación, no se permite un "+12" o un "E123" final). He escrito esta expresión regular:¿Cómo puedo verificar si al menos una de las dos subexpresiones en una expresión regular coincide?

/^([\d]*)(\.([\d]*))?$/ 

que coincide correctamente el siguiente:

1 
1. 
1.23 
.23 

Sin embargo, esto también coincide con una cadena vacía o una cadena de sólo un punto decimal, que no quiero.

Actualmente estoy comprobando después de ejecutar la expresión regular que $ 1 o $ 3 tiene una longitud mayor que 0. De lo contrario, no es válido. ¿Hay alguna manera de que pueda hacer esto directamente en la expresión regular?

+0

realidad estoy haciendo en Java, pero lo estoy publicando aquí como si fuera Perl porque el motor de expresiones regulares de Java es una afrenta a la decencia humana. – Kip

Respuesta

6

Creo que esto hará lo que quiera. O bien comienza con un dígito, en cuyo caso el punto decimal y los dígitos posteriores son opcionales, o comienza con un punto decimal, en cuyo caso al menos un dígito es obligatorio después de él.

/^\d+(\.\d*)?|\.\d+$/ 
+0

¿Qué motor de expresión regex no admite +? Me tomé la libertad de cambiar el código a lo que tendrías si supieras con seguridad que fue compatible. –

+0

Estaba pensando en algunas versiones de grep, sed y ed, pero es probable que el póster original esté usando algo más reciente. Es uno de esos hábitos que verá en personas que comenzaron con sistemas Unix que no usaron herramientas de GNU. También uso zcat en lugar de la opción -z para tar. – Glomek

0

Cree una expresión regular para cada caso y OR de ellos. Entonces solo necesitas una prueba si la expresión coincide.

/^(\d+(\.\d*)?)|(\d*\.\d+)$/ 
1

Una respuesta muy tarde, pero al igual que para responder, tomada de regular-expressions.info

[-+]?[\d]*\.?[\d]+? 

actualización Este [\d]*\.?[\d]+?|[\d]+\. le ayudará a juego 1.

http://regex101.com/r/lJ7fF4/7

+0

No coincide con '1.', que necesitaba considerar válido en mi aplicación. – Kip

+0

@Kip actualizó mi respuesta –

+0

ahora que ha vuelto a escribir mi expresión regular original. :) coincide con cadena vacía y '.', que es lo que estaba tratando de resolver. No creo que sea posible sin una condición "o". – Kip

Cuestiones relacionadas