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