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 № 1Java "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("^"([^"]+)"");