/ / ¿Cómo puedo analizar esta cadena con expresiones regulares? - java, regex

¿Cómo puedo analizar esta cadena con expresiones regulares? - java, regex

Tengo una cadena como:

"GOOG",625.00,"-1.95 - -0.31%"

Estoy usando este patrón, y no está emparejando. Estoy tratando de conseguir lo que hago. ¿Qué estoy haciendo mal?

Pattern pattern = Pattern.compile("^"([^"]+)");
Matcher matcher = pattern.matcher(line);

if (matcher.matches()) {
Log.i(TAG, matcher.group(0));
} else {
Log.i(TAG, "no match");
}

Respuestas

0 para la respuesta № 1

Java "s matches() El método espera que la expresión regular coincida con toda la cadena, como si estuviera anclada en ambos extremos con ^ y $ (o A y z). Siempre que uses matches() con una expresión regular que solo coincida con parte de la cadena, debe "rellenar" la expresión regular con .*, al igual que:

Pattern pattern = Pattern.compile(""([^"]+).*");
Matcher matcher = pattern.matcher(line);

if (matcher.matches()) {
Log.i(TAG, matcher.group(1));  // not group(0)!
} else {
Log.i(TAG, "no match");
}

los ^ al comienzo de la expresión regular no estaba haciendo ningún daño, simplemente lo quité para mostrar que no era necesario. Note que también cambié su group(0) a group(1)--que fue otro error en tu código. group(0) es todo el partido, mientras group(1) se refiere solo a la parte que coincidió en el primer conjunto de paréntesis de captura.

También tienes la opción de usar find(), al igual que:

Pattern pattern = Pattern.compile(""([^"]+)");
Matcher matcher = pattern.matcher(line);

if (matcher.find()) {
Log.i(TAG, matcher.group(1));
} else {
Log.i(TAG, "no match");
}

Esto coincide con la primera instancia de una citamarca seguida de uno o más caracteres distintos de comillas (que se capturan en el grupo # 1). Eso coincidirá en cualquier parte; si desea que coincida solo al principio de la cadena, tiene que usar el ^ ancla como la tenías en tu regex original: "^"([^"]+)"

(También hay un lookingAt() Método, que ancla automáticamente la coincidencia al principio de la cadena pero no al final, pero nadie la usa.)


3 para la respuesta № 2

El problema es que no estas corriendo matcher.find() por lo que la expresión nunca es realmente evaluada. Lo que tienes funcionará bien si lo cambias a:

if (matcher.find()) {

Aunque parece que sería más fácil si solo utilizara el String.split método (o mejor aún, use una biblioteca para analizar archivos CSV):

String temp = ""GOOG",625.00,"-1.95 - -0.31%"";
String[] parts = temp.split(",");
String symbol = temp[0].replaceAll(""", "");

0 para la respuesta № 3

primero necesita llamar a matcher.find ()

String temp = ""GOOG",625.00,"-1.95 - -0.31%"";
Pattern pattern = Pattern.compile(""[a-zA-Z]*"");
Matcher matcher = pattern.matcher(temp);

if(matcher.find()){
Log.i(TAG, matcher.group(0).split(""")[1]);
} else {
Log.i(TAG, "no match");
}

0 para la respuesta № 4

Pruebe este Regex:

^"(?<text>[^"]+?)"

Creo que te perdiste el segundo "(el que está después de lo que está" ")

EDITAR:

Pattern pattern = Pattern.compile("^"([^"]+)"");