/ / W jaki sposób analizować ten ciąg za pomocą wyrażenia regularnego? - java, regex

Jak przeanalizować ten ciąg za pomocą wyrażenia regularnego? - java, regex

Mam ciąg jak:

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

Używam tego wzoru i nie pasuje. Próbuję zdobyć GOOG. Co robię źle?

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

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

Odpowiedzi:

0 dla odpowiedzi № 1

Java " matches() metoda oczekuje, że wyrażenie regularne będzie pasowało do całego ciągu, tak jakby był zakotwiczony na obu końcach ^ i $ (lub A i z). Kiedykolwiek używasz matches() z wyrażeniem regularnym, które pasuje tylko do części ciągu, musisz „wyrównać” wyrażenie regularne .*, jak na przykład:

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

The ^ na początku wyrażenia regularnego nie było nic złego, po prostu usunąłem go, aby pokazać, że nie było to konieczne. Zauważ, że zmieniłam również twoje group(0) do group(1)- to był kolejny błąd w kodzie. group(0) jest cały mecz, podczas gdy group(1) odnosi się tylko do części dopasowanej w pierwszym zestawie przechwytujących nawiasów.

Masz również możliwość korzystania find(), jak na przykład:

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

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

To pasuje do pierwszego wystąpienia cytatuznak, po którym następuje jeden lub więcej znaków innych niż cudzysłowy (które są przechwycone w grupie # 1) To pasuje wszędzie; jeśli chcesz dopasować tylko na samym początku łańcucha, musisz użyć ^ zakotwicz jak w oryginalnym wyrażeniu regularnym: "^"([^"]+)"

(Jest też a lookingAt() metoda, która automatycznie zakotwicza dopasowanie na początku ciągu, ale nie na końcu, ale nikt go nie używa.)


3 dla odpowiedzi № 2

Problem polega na tym, że nie jesteś uruchomiony matcher.find() więc wyrażenie nigdy nie jest naprawdę oceniane. To, co masz, będzie działać, jeśli zmienisz je na:

if (matcher.find()) {

Choć wygląda na to, że będzie łatwiej, jeśli użyłeś String.split metoda (lub jeszcze lepiej, użyj biblioteki do analizowania plików CSV):

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

0 dla odpowiedzi № 3

najpierw musisz zadzwonić do 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 dla odpowiedzi nr 4

Wypróbuj Regex:

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

Myślę, że brakowało ci drugiego (tego po GOOG)

EDYTOWAĆ :

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