2012-05-09 13 views
7

Tengo esta expresión regular "^[0-9]+\.?[0-9]*$") para que coincida con un número doble o un número entero en C++ visual, pero parece que no funciona. algunas ideas. así es como estoy solicitando el código:Regexp para un doble

if (System::Text::RegularExpressions::Regex::IsMatch(e0, "^[0-9]+\.?[0-9]*$")) 
      { 
       e0_val = System::Convert::ToDouble(e0); 
      } 
+2

¿Por qué crees que no funciona? Dar un ejemplo. –

+0

@AndrewLogvinov +1, "does not work gimme teh codez" no es una buena forma de pregunta. –

+0

espacios en blanco al principio o al final tal vez? ¿Puedes publicar el código que lo está usando? –

Respuesta

9

No hay nada malo con la expresión regular por decir, es su escape que tiene la culpa. Necesita duplicar el carácter \, ya que también es un carácter de escape de cadena C++.

Además existe un caso de borde donde esta expresión regular podría pensar que 1. es un número de puntero flotante válido. Por lo que es posible que esté mejor con /^[0-9]+(\\.[0-9]+)?$ que elimina esa posibilidad.

2

la expresión regular anterior no es perfecta ya que acepta "09", que no es un número válido. una mejor expresión sería:

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

donde: "(. \ [0-9] * [1-9])?"

1. is an optional negative sign; 
2. is zero or a valid non-zero integer; 
4. is the optional fracture part; 

en teoría, la herramienta de fractura debe ser escrita como en su lugar, porque un número no debe tener ceros de cola. En la práctica, la cadena de origen podría haber sido creado con un número fijo de dígitos por ejemplo:

printf("%.1f", x); 

por lo que podría terminar fácilmente con un carácter cero. y, por supuesto, todas estas son representaciones de puntos fijos, no las dobles. un número doble puede escribirse como -1.23e-4 también en lugar de -0.000123.