Eu tenho uma string como:
"GOOG",625.00,"-1.95 - -0.31%"
Eu estou usando esse padrão e não é compatível. Eu estou tentando pegar o GOOG. O que estou fazendo de errado?
Pattern pattern = Pattern.compile("^"([^"]+)");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
Log.i(TAG, matcher.group(0));
} else {
Log.i(TAG, "no match");
}
Respostas:
0 para resposta № 1Java "s matches()
método espera que o regex para coincidir com a seqüência inteira, como se estivesse ancorado em ambas as extremidades com ^
e $
(ou A
e z
). Sempre que você usa matches()
com um regex que corresponde apenas a parte da string, você precisa "pad" a regex com .*
, igual a:
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");
}
o ^
no começo do regex não estava fazendo nenhum mal, eu apenas o removi para mostrar que não era necessário. Observe que eu também mudei seu group(0)
para group(1)
- Isso foi outro erro no seu código. group(0)
é o jogo todo, enquanto group(1)
refere-se apenas à parte que foi correspondida no primeiro conjunto de parênteses de captura.
Você também tem a opção de usar find()
, igual a:
Pattern pattern = Pattern.compile(""([^"]+)");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
Log.i(TAG, matcher.group(1));
} else {
Log.i(TAG, "no match");
}
Isso corresponde à primeira instância de uma cotaçãomarca seguida por um ou mais caracteres que não sejam aspas (capturados no grupo # 1). Isso vai combinar em qualquer lugar; se você quer que ele combine apenas no começo da string, você tem que usar o ^
anchor como você tinha em sua regex original: "^"([^"]+)"
(Há também um lookingAt()
método, que ancora automaticamente a correspondência para o início da cadeia, mas não o fim, mas ninguém nunca usa.
3 para resposta № 2
O problema é que você não está correndo matcher.find()
então a expressão nunca é realmente avaliada. O que você tem funcionará bem se você apenas mudar para:
if (matcher.find()) {
Embora isso pareça ser mais fácil se você acabou de usar o String.split
método (ou melhor ainda, use uma biblioteca para analisar arquivos CSV):
String temp = ""GOOG",625.00,"-1.95 - -0.31%"";
String[] parts = temp.split(",");
String symbol = temp[0].replaceAll(""", "");
0 para resposta № 3
você primeiro precisa chamar 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 a resposta № 4
Experimente o Regex:
^"(?<text>[^"]+?)"
Eu acho que você estava perdendo segundo "(aquele após GOOG")
EDITAR:
Pattern pattern = Pattern.compile("^"([^"]+)"");