2011-05-13 15 views
13

Ben formun regexpi vardır:Ruby'de regexp - Gruplandırmadan parantez kullanabilir miyim?

/(something complex and boring)?(something complex and interesting)/ 

Ben ikinci parantez içeriğini ilgileniyorum; Bunlardan ilki sadece doğru bir eşleşme sağlamak için vardır (çünkü sıkıcı kısım mevcut olabilir veya olmayabilir, fakat eğer varsa, ilginç bölümün regexp'i ile kaza ile eşleştireceğim).

İkinci eşleştirmeye 2 $ 'yı kullanarak erişebiliyorum. Ancak, kullanıyorum diğer regexps ile tekdüzelik için bir şekilde 1 $ ikinci paretez içeriğini içereceğini istiyorum. Mümkün mü?

+0

sayesinde herkes kullanabilir bahis! –

cevap

18

kullanın olmayan bir yakalama grubunu:

r = /(?:ab)?(cd)/ 
-4

Pek değil, hayır. Ama bu gibi bütünlüğü için bir adındaki grup kullanabilirsiniz:

/(?<group1>something complex and boring)?(?<group2>something complex and interesting)/ 

Sen ulaşmak istediğiniz düzgünlüğü için (açılı ayraçlar metni) isimlerini değiştirebilir. Sonra böyle gruplara erişemez:

/(?:something complex and boring)?(something complex and interesting)/ 
2

yup, ?: sözdizimini kullanın. Bunu elde etmek için /(?:something complex and boring)?(something complex and interesting)/ kullanın (?:'a dikkat edin). Bu arada

, Ruby 1.9 içinde, sen /(something complex and boring)?(?<interesting>something complex and interesting)/ yapabilirsiniz ve $~[:interesting] ile gruba ulaşabilmek;)

9

Burası sigara yakut regexp'in özelliğidir:

string.match(/(?<group1>something complex and boring)?(?<group2>something complex and interesting)/) do |m| 
    # Do something with the match, m['group'] can be used to access the group 
end 
1

Ben ancak bir yakut geliştirici değilim Diğer regex tatlarını biliyorum. Bu yüzden bir olmayan yakalama grubunu

tek yakalama grubu yok
/(?:something complex and boring)?(something complex and interesting)/ 

, hızlı ve aydınlatıcı cevap için dolayısıyla $ 1

HTH

İlgili konular