2016-04-07 1 views
1

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.

+2

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] +) "; ' –

+0

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. –

+0

@ WiktorStribiżew: Danke, das habe ich getan, ich habe Laurels Antwort angenommen, die dasselbe suggeriert! – Galarzaa90

Antwort

1

Sie müssen die / vom Anfang und Ende entfernen. Ich würde auch die .*? von Anfang an entfernen, da sie keinen Zweck erfüllt, sondern die Dinge verlangsamt. Entfernen

private static String LAST_LOG = "Last login:.*?td.*?td.*?([A-Za-z]+).*?;([0-9]+).*?;([0-9]+).*?;([0-9]+):([0-9]+):([0-9]+).*?([A-Z]+)";

+0

Ich versuche immer, keine Fragen zu stellen, die eine so einfache Lösung hatten, das tue ich wirklich! Also, im Grunde hatte ich wirklich Glück, dass der Rest meiner Regex mit dem Öffnen und Schließen '/' den Rest der regulären Ausdrücke übereinstimmte. Entfernte sie von allen Mustern und entfernte das '. *?', Wie es wirklich notwendig war. Immer noch lernen Regex, danke! – Galarzaa90

Verwandte Themen