Pattern/Matcher-Gruppe() to obtain substring in Java?
UPDATE: Danke für all die tollen Antworten! Ich habe versucht, viele verschiedene regex-Muster, aber nicht verstehen, warum m.matches() war nicht dabei, was ich denke, sollte es tun. Wenn ich wechselte zu m.finden() statt, sowie die Anpassung der regex-Muster, ich war in der Lage, um irgendwohin zu gelangen.
Ich würde gerne die einem Muster entsprechen, in einen Java-string extrahieren und dann das Teil abgestimmt mit einem regex (wie Perl $& - operator).
Dies ist meine Zeichenkette "s": DTSTART;TZID=America/Mexico_City:20121125T153000
Ich möchte zum extrahieren des Teil - "Amerika/Mexico_City".
Dachte ich, ich könnte mit Pattern und Matcher und extrahieren Sie dann mit m.Gruppe (), aber es funktioniert nicht so, wie ich es erwartet habe. Ich habe versucht monkeying mit verschiedenen regex-strings und die einzige Sache, die scheint, zu schlagen auf m.matches() ist ".*TZID.*"
ist sinnlos, da es nur die gesamte Zeichenfolge zurück. Könnte jemand mich aufklären?
Pattern p = Pattern.compile ("TZID*:"); //<- change to "TZID=([^:]*):"
Matcher m = p.matcher (s);
if (m.matches ()) //<- change to m.find()
Log.d (TAG, "looking at " + m.group ()); //<- change to m.group(1)
- Sieht aus wie eine Zeile aus eine ics (iCal) Datei - warum nutzen Sie nicht ical4j.sourceforge.net oder gleichwertige?
- In der Tat. Angefangen habe ich mit ical4j aber es schleuderte mit einem Fehler beim Parsen der ics-Datei, so verwerfen Sie. Ich kann versuchen es wieder, wenn ich mehr Funktionen als nur die Extraktion des DTSTART Linien.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie
m.match()
, die versucht, die ganze Zeichenfolge, wenn Sie diem.find()
haben, sucht er für das match hinein, auch habe ich ein wenig verbessert regexp ausschließen TZID Präfix mit zero-width look-behind:Diese sollte gut funktionieren:
Einen alternativen regex ist
"TZID=([^:]*)"
. Ich bin mir nicht sicher, welche schneller ist.Verwenden Sie die falschen Muster, versuchen Sie dies:
.*?
wird alles gefunden was am Anfang bis zuTZID=
, dannTZID=
entsprechen und eine Gruppe beginnt und match alles bis zu:
ist, wird die Gruppe hier in der Nähe, und dann:
entsprechen und.*
match wird der rest der Zeichenkette, jetzt können Sie bekommen, was Sie brauchen, ingroup(1)
Ihnen fehlt ein Punkt vor dem Sternchen. Ihr Ausdruck wird eine beliebige Anzahl von Großbuchstaben
D
s.Sollten Sie auch hinzufügen, eine einfangen Gruppe, es sei denn, Sie wollen, um alles zu erfassen, einschließlich der
"TZID"
und die":"
Schließlich, Sie sollten verwenden Sie die richtige API zu suchen, die die Zeichenfolge, sondern als der Versuch mit der Zeichenfolge in seiner Gesamtheit.
Diese druckt
Warum nicht einfach aufteilen, wie: