2010-02-10 38 views
8

bir grup yakalanmış parantez değil bir ifade için herhangi bir yolu var mı Opsiyonel Bloklar ile Numaralandırma Grubu?bir Düzenli İfade

E.g. İsteğe bağlı bloklar (B|C)? ve (F|G)? gerek parantez

(A(B|C)?) D (E(F|G)?) 

dikkate alınız: i bir böyle ifade şey var.
Bu gruplarda yakalananlarla ilgilenmiyorum. Tek istediğim ilk ve son bloğun tamamını yakalamak.

Ama nedeniyle opsiyonel blokların, grup numaralandırması değişecek ve ben (E(F|G)?) grupta 2 veya 3 olarak yakalandı eğer

i sonuç gruplarında isteğe bağlı parçaların görmezden ifadesini söyleyebilir söyleyemem Yani grup numaralandırma aynı kalacak? Ya da isteğe bağlı yakalamalar yapabilirim, her zaman gruplar halinde görünür - null olduğunda bile? Böyle bir grubun maç referans edilemez

(A(?:B|C)?) D (E(?:F|G)?) 

:

cevap

15

(E(F|G)?) her grup 3. numaralandırma model dize parantez açma düzenine göre belirlenir olarak yakalar:

(A(B|C)?) D (E(F|G)?) 
^^  ^^ 
1 2   3 4 

(B|C) sonra giriş dizesi group(2) oluşmaz olacak null döndürür, ancak sonraki gruplar yeniden numaralandırılmaz.

numaralandırma etkilememektedir sadece gruplar

örneğin olmayan yakalama grubu olup,

(A(?:B|C)?) D (E(?:F|G)?) 
^   ^
1    2 

Örnek:

Pattern pattern = Pattern.compile("(A(B|C)?) D (E(F|G)?)"); 
Matcher matcher = pattern.matcher("A D EG"); 
if (matcher.matches()) { 
    System.err.println(matcher.group(1)); 
    System.err.println(matcher.group(2)); 
    System.err.println(matcher.group(3)); 
    System.err.println(matcher.group(4)); 
} 

Çıktı:

A 
null 
EG 
G 
+0

Haklısın. Görünüşe göre sadece 3 grup (ama indeks 1, 3 ve 4 ile) gösteren tutulması plug-in QuickREx tarafından yanlış yönlendirildi. Ancak, yakalamayan bit, gürültüyü azaltmak için hala çok kullanışlı oluyor. – Stroboskop

9

olmayan yakalama grupları (?:…) vardır.