2012-12-07 15 views
7

GÜNCELLEME: Tüm harika yanıtlar için teşekkürler! Çok farklı regex desenlerini denedim ama m.matches() 'in neden yapması gerektiğini düşündüğüm şeyi yapmadığını anlamamıştım. Bunun yerine, m.find()'a geçtiğimde, normal ifadeyi ayarlamanın yanı sıra bir yere ulaşabildim.Java'da substring elde etmek için Pattern/Matcher group()?


I (Perl'in $ & operatör gibi) regex kullanarak eşleştirilmiş kısmını bir Java dizesinde bir desenle eşleşen ve sonra ayıklamak istiyorum

.

Bu benim kaynak dizgisi "s": DTSTART;TZID=America/Mexico_City:20121125T153000 "America/Mexico_City" kısmını ayıklamak istiyorum.

Desen ve Eşleştirici'yi kullanabileceğimi düşündüm ve sonra m.group() kullanarak çıkarım ancak beklediğim gibi çalışmıyor. Ben farklı regex dizeleri ile maymun çalıştım ve m.matches() isabet gibi görünüyor tek şey sadece tüm dize döndürür anlamsız ".*TZID.*" olduğunu. Birisi beni aydınlatır mı?

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) 
+0

bir ics (iCal) dosyasından bir çizgi gibi görünüyor - neden http://ical4j.sourceforge.net/ veya eşdeğerini kullanmıyorsun? – jrtc27

+0

Gerçekten. Ical4j ile başladım ama ics dosyasını ayrıştırırken bir hata ile fırladı, bu yüzden onu terk etti. Sadece DTSTART satırlarını ayıklamaktan daha fazla işlevsellik gerekiyorsa tekrar deneyebilirim. – wufoo

cevap

7

, içeride maç için arayacaktır, ayrıca senin regexp'in biraz düzeldi sıfır genişlikli arkasına bakmak kullanarak TZID öneki dışlamak için:

 Pattern p = Pattern.compile("(?<=TZID=)[^:]+"); // 
    Matcher m = p.matcher ("DTSTART;TZID=America/Mexico_City:20121125T153000"); 
    if (m.find()) { 
     System.out.println(m.group()); 
    } 
2

Yıldız işaretinden önce noktayı kaçırıyorsunuz. İfadeniz herhangi bir sayıda D s ile eşleşecektir. Eğer "TZID" ve Nihayet ":"

Pattern p = Pattern.compile ("TZID=([^:]*):"); 

dahil her şeyi, yakalamak istediğiniz sürece

Pattern p = Pattern.compile ("TZID[^:]*:"); 

Ayrıca bunun yerine, dize aramak için doğru API kullanmalıdır bir yakalayan grup eklemek gerekir dizgiyi bütünüyle eşleştirmeye çalışmaktan çok.

Pattern p = Pattern.compile("TZID=([^:]*):"); 
Matcher m = p.matcher("DTSTART;TZID=America/Mexico_City:20121125T153000"); 
if (m.find()) { 
    System.out.println(m.group(1)); 
} 

Bu prints Yanlış desen kullanıyorsunuz

America/Mexico_City 
2

, şunu deneyin:

Pattern p = Pattern.compile(".*?TZID=([^:]+):.*"); 
Matcher m = p.matcher (s); 
if (m.matches()) 
    Log.d (TAG, "looking at " + m.group(1)); 

.*?TZID= kadar başlangıçta bir şey maç olacak, o zaman TZID= maç ve bir Grup başlayacak ve :'a kadar her şeyi eşleştirecek, grup buradan kapanacak ve : maç olacak ve .* şimdi size group(1)

+0

Neredeyse aynı cevabımı sizin lehinize sildim. Biraz daha iyi bir regexin vardı. – mikeslattery

6

Bu güzel çalışması gerektiğini ne gerek alabilir, dize geri kalanı maç olacak:

Pattern p = Pattern.compile("TZID=(.*?):"); 
Matcher m = p.matcher(s); 
if (m.find()) { 
    String zone = m.group(1); // group count is 1-based 
    . . . 
} 

alternatif bir regex "TZID=([^:]*)" olduğunu. Hangisinin daha hızlı olduğundan emin değilim.olarak

1

Neden sadece bölünmüş kullanın: Eğer m.find() kullanacaksanız Sen bütün dizeyi eşleştirmeye çalışır m.match() kullanmak

String origStr = "DTSTART;TZID=America/Mexico_City:20121125T153000"; 
    String str = origStr.split(":")[0].split("=")[1]; 
+0

Çok şık bir çözüm. Teşekkürler – wufoo

İlgili konular