Ich habe überall nach einer Lösung gesucht, ich habe es mit verschiedenen Regex Flags versucht, ohne Erfolg.Regex Muster funktioniert nicht in Android, aber passt in andere Plattformen
Ich habe folgendes RegexMuster:
private static String LAST_LOG = "/.*?Last login:.*?td.*?td.*?([A-Za-z]+).*?;([0-9]+).*?;([0-9]+).*?;([0-9]+):([0-9]+):([0-9]+).*?([A-Z]+)/";
Ich versuche, ein Spiel in diesem string zu finden.
Wie Sie sehen können, findet es eine Übereinstimmung und erfasst Daten in 7 Gruppen (Monat, Tag, Jahr, Stunde, Minute, Sekunde, Zeitzone).
Das Problem ist, dass ich überhaupt keine Übereinstimmung bekomme, habe ich die Zeichenfolge getestet und es enthält den Teil, den ich suche, so kann ich keinen anderen Grund dafür finden, nicht zu funktionieren in Android.
m = getMatcher(content,LAST_LOG);
if(m.find()) {
Log.e("Month",m.group(1));
Log.e("Day",m.group(2));
Log.e("Year",m.group(3));
Log.e("Hour",m.group(4));
Log.e("Minute",m.group(5));
Log.e("Second",m.group(6));
Log.e("Timezone",m.group(7));
}
private static Matcher getMatcher(String str, String regex){
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(str);
}
Und das ist nicht die einzige regexp, die mir Probleme verursacht, ich habe andere, die gerade arbeiten, aber einfache Modifikationen macht sie nicht, auch auf anderen Plattformen gedacht (und Online-Regex-Tester) sie funktionieren gut.
Ich habe das gleiche regexp in einem Python-Skript und es funktioniert ohne Probleme:
regex_last = r'.*?Last login:.*?td.*?td.*?([A-Za-z]+).*?;([0-9]+).*?;([0-9]+).*?;([0-9]+):([0-9]+):([0-9]+).*?([A-Z]+)'
m = re.search(regex_last,content.decode())
if m:
print(m.group(1))
print(m.group(2))
print(m.group(3))
print(m.group(4))
print(m.group(5))
print(m.group(6))
print(m.group(7))
else:
print('No match')
Ausgänge:
Apr
07
2016
17
33
52
CEST
Ich bin so nah an einem HTML-Parser zu wechseln, aber da Ich hatte bereits funktionierende Regexps sowohl in Python als auch in Android, und ich dachte, dass die Verwendung regulärer Ausdrücke es einfacher machen würde, zwischen Plattformen zu wechseln, entschied ich mich, sie zu verwenden.
die regex Trennzeichen '/' am Anfang und Ende des Musters. ICU Regex benötigt sie nicht, sie werden als Literale behandelt. Versuche 'private static String LAST_LOG =". *? Letzte Anmeldung:. *? Td. *? Td. *? ([A-Za-z] +). * ?; ([0-9] +). *? ; ([0-9] +). * ?; ([0-9] +): ([0-9] +): ([0-9] +). *? ([AZ] +) "; ' –
Da die Regex-Zeichenfolge eine Konstante wäre, ebenso wie eine XPath-Abfrage, und alles andere würde sich über die Sprachen ändern, macht Ihre letzte Aussage keinen Sinn. –
@ WiktorStribiżew: Danke, das habe ich getan, ich habe Laurels Antwort angenommen, die dasselbe suggeriert! – Galarzaa90