/ / Wie analysiere ich diese Zeichenfolge mit Regex? - Java, Regex

Wie analysiere ich diese Zeichenfolge mit Regex? - Java, Regex

Ich habe eine Zeichenfolge wie:

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

Ich benutze dieses Muster und es stimmt nicht überein. Ich versuche GOOG zu bekommen. Was mache ich falsch?

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

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

Antworten:

0 für die Antwort № 1

Java "s matches() Methode erwartet, dass die Regex der gesamten Zeichenfolge entspricht, als ob sie an beiden Enden mit verankert wäre ^ und $ (oder A und z). Wann immer Sie verwenden matches() mit einer Regex, die nur einen Teil der Zeichenfolge entspricht, müssen Sie die Regex mit "pad" .*, so:

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");
}

Das ^ Zu Beginn der Regex habe ich keinen Schaden angerichtet, ich habe es einfach entfernt, um zu zeigen, dass es nicht nötig war. Beachten Sie, dass ich auch Ihre geändert habe group(0) zu group(1)- Das war ein weiterer Fehler in Ihrem Code. group(0) ist das ganze Spiel, während group(1) bezieht sich nur auf den Teil, der im ersten Satz der einfangenden Klammern gefunden wurde.

Sie haben auch die Möglichkeit zu verwenden find(), so:

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

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

Dies entspricht der ersten Instanz eines ZitatsMarkierung gefolgt von einem oder mehreren anderen Zeichen als Anführungszeichen (die in Gruppe 1 erfasst werden). Das wird überall passen; Wenn Sie möchten, dass es nur am Anfang der Zeichenfolge übereinstimmt, müssen Sie die Option verwenden ^ verankern Sie, wie Sie es in Ihrem ursprünglichen Regex hatten: "^"([^"]+)"

(Es gibt auch ein lookingAt() Methode, die die Übereinstimmung automatisch an den Anfang der Zeichenfolge verankert, aber nicht am Ende, aber niemand verwendet sie jemals.)


3 für die Antwort № 2

Das Problem ist, dass Sie nicht laufen matcher.find() so wird der Ausdruck nie wirklich bewertet. Was Sie haben, wird gut funktionieren, wenn Sie es einfach ändern zu:

if (matcher.find()) {

Obwohl es scheint, als wäre es einfacher, wenn Sie nur die String.split Methode (oder noch besser, verwenden Sie eine Bibliothek zum Parsen von CSV-Dateien):

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

0 für die Antwort № 3

Sie müssen zuerst matcher.find () aufrufen

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 für die Antwort № 4

Probieren Sie Regex:

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

Ich glaube, du fehlst an zweiter Stelle "(der nach GOOG)

EDIT:

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