validar utilizadas tabla regulares puntocomnoesunlenguaje parentesis nombre expresiones ejemplo java regex

utilizadas - tabla expresiones regulares java



Java: cómo analizar el doble de expresiones regulares (4)

Para hacer coincidir cualquier secuencia de dígitos y puntos, puede cambiar la expresión regular a esto:

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

Si desea estar seguro de que solo hay un punto, puede intentar 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 correctamente esta situación.

Tengo una cadena que se parece a "A = 1.23; B = 2.345; C = 3.567"

Sólo estoy interesado en "C = 3.567"

lo que tengo hasta ahora 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 el 3 como separado del 567.

salida:

3.0

567.0

Me pregunto cómo puedo incluir el decimal para que genere "3.567".

EDITAR: también me gustaría hacer coincidir C si no tiene un punto decimal: así que me gustaría capturar 3567, así como 3.567

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


Si necesita validar el decimal con puntos, comas, positivos y negativos:

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

Buena suerte.


Tu expresión regular solo coincide con caracteres numéricos. Para igualar el punto decimal también necesitarás:

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

El . se escapa porque esto coincidiría con cualquier personaje cuando no se escape.

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


Puede que me equivoque en esta parte, pero la razón por la que se está separando de las dos es porque group() solo coincidirá con la última subsecuencia coincidente, que es lo que coincida con cada llamada a find() . Gracias, Mark Byers.

Sin embargo, seguro que puede resolver esto colocando toda la parte que desea dentro de un "grupo de captura", que se realiza colocándola entre paréntesis. Esto lo hace para que pueda agrupar partes combinadas de su expresión regular en una subcadena. Tu patrón entonces se vería como:

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

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

Entonces, para obtener su 3.567, usted llamaría a m. group(1) para capturar el primer grupo especificado (contando de 1). Esto significaría que su llamada Double.parseDouble se convertiría esencialmente en Double.parseDouble("3.567")

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

Editar Para los casos más generales (¡y probablemente más útiles!) En el comentario de gawi, use lo 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 partes decimales opcionales, y exponentes positivos / negativos opcionales. Insertar grupos de captura donde se desee seleccionar partes individualmente. El exponente en su conjunto está en su propio grupo para hacerlo, en conjunto, opcional.