/ / Como faço para analisar essa seqüência de caracteres com regex? - java, regex

Como analiso essa string com regex? - java, regex

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 № 1

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