2010-09-09 19 views
14

que tiene una cadena que se ve como "A = 1,23; B = 2,345; C = 3.567"Java: cómo analizar doble de expresiones regulares

Sólo estoy interesado en "C = 3.567"

lo Hasta ahora he es:

 Matcher m = Pattern.compile("C=\\d+.\\d+").matcher("A=1.23;B=2.345;C=3.567"); 

    while(m.find()){ 
     double d = Double.parseDouble(m.group()); 
     System.out.println(d); 
    } 

el problema es que muestra la 3 como separada de la salida 567

:

3.0

567,0

Me gustaría saber cómo puedo incluir el decimal por lo que da salida a "3.567"

EDIT: También me gustaría hacer coincidir C si no tiene un punto decimal: por lo Me gustaría capturar 3567 y 3.567

ya que C = también está integrado en el patrón, ¿cómo puedo quitarlo antes de analizar el doble?

+2

Un punto (".") No es un dígito. –

Respuesta

29

puedo estar equivocado en esta parte, pero la razón sea separando los dos es porque group() sólo igualará el último emparejado subsecuencia, que es lo que se pone igualada por cada llamada a find(). Gracias, Mark Byers.

Sin duda, puede resolver esto colocando la parte completa que desea dentro de un "grupo de captura", lo que se hace ubicándolo entre paréntesis. Esto lo hace para que pueda agrupar las partes coincidentes de su expresión regular en una subcadena. Su patrón sería el siguiente aspecto:

Pattern.compile("C=(\\d+\\.\\d+)") 

Para el análisis de 3567 o 3.567, su patrón habríaC=(\\d+(\\.\\d+)?)con el grupo 1 que representa el número entero.Además, tenga en cuenta que, dado que desea coincidir específicamente con un punto, quiere escapar de su carácter . (punto) para que no se interprete como el token "cualquier carácter". Para esta entrada, sin embargo, no importa

Luego, para obtener su 3.567, usted llamaría a m. group(1) para tomar el primer grupo (que cuenta desde 1) especificado. Esto significaría que su llamada Double.parseDouble esencialmente se convertiría en Double.parseDouble("3.567")

En cuanto a tomar C = fuera de su patrón, ya que no soy tan versado con RegExp, podría recomendar que split su cadena de entrada en el punto y coma y luego verifique si cada una de las divisiones contiene la C; luego puede aplicar el patrón (con los grupos de captura) para obtener el 3.567 de su Matcher.

Edición Para los más general (y probablemente más útil!) Casos en el comentario de gawi, por favor utilice el siguiente (de http://www.regular-expressions.info/floatingpoint.html)

Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?") 

Esto tiene soporte para signo opcional, ya sea entero opcional o facultativo partes decimales y exponentes positivos/negativos opcionales. Inserte grupos de captura donde desee para elegir piezas individualmente. El exponente como un todo está en su propio grupo para hacerlo, como un todo, opcional.

+1

NOTA: La expresión regular no se ocupa de las siguientes carrozas: 10 10. .1 1.3e10 1.2e-12 1.41e + 12 – gawi

+0

@gawi Gracias :) He actualizado la respuesta con una expresión regular que debería funcionar. . ¿10. se considera una flotación válida, con el punto decimal pero sin dígitos después? – btlachance

+1

10. es un literal flotante válido en Java (bueno ... 10.f para ser exacto) – gawi

2

para encontrar cualquier secuencia de dígitos y puntos puede cambiar la expresión regular para esto:

"(?<=C=)[.\\d]+" 

Si usted quiere estar seguro de que no hay más que un solo punto es posible que desee probar algo como esto:

"(?<=C=)\\d+(?:\\.\\d+)?" 

también debe tener en cuenta que este patrón puede coincidir con el 1.2 en ABC=1.2.3;. Debe considerar si necesita mejorar la expresión regular para manejar esta situación correctamente.

4

Su expresión regular solo hace coincidir caracteres numéricos. También para que coincida con el punto decimal también se necesita:

Pattern.compile("\\d+\\.\\d+") 

El . se escaparon porque esto concordaría con cualquier carácter cuando no literal.

Nota: esto solo coincidirá con los números con un punto decimal que es lo que tiene en su ejemplo.

1

si es necesario para validar decimal con puntos, comas, puntos positivos y negativos:

Object testObject = "-1.5"; 
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,][0-9]+$", (CharSequence) testObject); 

Buena suerte.

+1

¿No está {1} implícito? – Cutter

+1

@cutter sí, no recuerdo por qué agregué ese {1}. Tal vez para ser más claro o porque era tan novato con expresiones regulares en 2015 xD – august0490

+0

La única respuesta que trata los números negativos (y positivos con el líder +) correctamente. – Robert

Cuestiones relacionadas