2010-01-26 29 views
12

que tienen este patrón:números de expresiones regulares a juego con punto flotante

[0-9]*\.?[0-9] 

Coincide con números, sino que también coincide 3.5.4 como:

  1. 3,5
  2. .4

¿Cómo solucionar eso (esta entrada no debe coincidir)?
UPDATE:
esto también debería funcionar en entrada: 1 3.5.4 10

1,2. no está permitido
.3 está permitido

no se permite ningún carácter que no sea una coma de número, como: a1 2.4f 3. 45, 67!

+1

¿Quieres que coincida con '1.23'? ¿Qué pasa con '.3'? –

+0

Si su entrada contiene múltiples coincidencias, ¿las quiere todas? ¿Su entrada podría contener algo más que puntos, dígitos y espacios? –

+0

sí, la entrada puede tener cualquier cosa – ronik

Respuesta

10

respuesta actualizada después de comentario de cartel:

Uso de búsqueda hacia delante/búsqueda hacia atrás para asegurarse de que los personajes antes y después son espacios:

Aquí hay una versión que coincide estrechamente el suyo, pero que no va a hacer que las búsquedas parciales:

(?:^|(?<=\s))[0-9]*\.?[0-9](?=\s|$) 

Para estos dos ejemplos, cuando se ejecuta en la cadena 1 2.3.4 5.6 solo coincide con 1 y 5.6.

+0

es?: ¿Es válido el modificador en todas las plataformas? – ronik

+0

La mayoría, sí. ¿Qué plataforma estás usando? Mi solución actual no usa '?:' De todos modos. Y aunque lo hiciera, siempre es opcional, simplemente mejora el rendimiento. Entonces, si su plataforma no lo admite, simplemente elimínelo. –

+0

@ronik: Creo que mi respuesta es casi lo que quieres, pero debes responder mis preguntas aclaratorias antes de poder hacer algo que sea exactamente lo que necesitas. Vea los comentarios en su pregunta y responda o actualice su pregunta para incluir las respuestas. –

2

Su expresión regular no está anclada. Si desea hacer coincidir las líneas que contienen sólo números y nada más uso:

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

Esto fallará en 1.23. ¿Por qué se sube la votación? – cletus

+0

No parece que quiera emparejar '1.23'. (Mire su expresión regular original) – SLaks

+0

¿Quizás el póster no quiere emparejar '1.23'? Le pediré que aclare este punto. –

1

No debe usar una expresión regular para esto a menos que realmente lo necesite.

En su lugar, debe utilizar los métodos de análisis de números incorporados de su idioma.

Supongo por sus otras preguntas que está usando Javascript; si es así, debe llamar al parseFloat.

+0

Sé que puedo usar (uso C#), pero pregunté sobre la expresión regular pura – ronik

+2

-1 por suponer que las expresiones regulares son incorrectas. Las sugerencias alternativas son una cosa, pero declaraciones insulsas como "No deberías usar una expresión regular para esto a menos que realmente lo necesites" son inflamatorias y no consideran los contextos posibles para la pregunta. –

+0

@PP: antes de su edición, las expresiones regulares eran incorrectas para esto. "A menos que realmente se necesite" considera los contextos de la pregunta. – SLaks

7

Tiene que decidir si quiere aceptar números sin ceros a la izquierda (por ejemplo, .123). Si no, entonces la expresión regular es fácil:

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

Si lo hace, entonces es un poco más complejo:

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

Tanto presumir que un punto decimal debe ser seguido por al menos un dígito. Si no acepta números negativos, entonces el -? principal no es necesario.

+0

@cletus: He recalculado su representante, según lo solicitado. Cambió una cantidad tan pequeña, pensé que sería mejor que lo haga saber. :) –

12

para que coincida con un número JSON:

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

JSON number

Utilice esta expresión regular para que coincida con .123:

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

Este ejemplo no permite '.5'. Este 'número' es específico de JSON. – Marius

+0

Aquí hay una expresión que también permitirá puntos decimales iniciales: '[+ \ -]? (?: (?: \ D +) (?: \. \ D *)? | (?: \. \ D +) +) (?: [eE] [+ \ -]? \ d +)? '. Básicamente dice "o bien tienes un dígito, entonces puedes agregar opcionalmente un punto decimal y más dígitos, o comienzas con un punto decimal, en cuyo caso debes tener al menos un dígito". – maschu

Cuestiones relacionadas