2011-04-09 13 views
16

Böyle aşağıda Line A gibi iki kelime, sırayla word_1 ve word_2 içerir dosyalarda satırları bulmak gibi değil, ama Line B veya Line C gibi olacaktır:ack regex: Aynı hat sırayla iki kelime Eşleştirme

Line A: ... word_1 .... word_2 .... 
Line B: ... word_1 .... 
Line C: ... word_2 .... 

Ben

$ack '*word_1*word_2' 
$ack '(word_1)+*(word_2)+' 

denedim ve ^ ile aynı komutları (Perl regex sözdizimi takip etmek amacıyla) regex başında eklenir. Bu komutların

Yok dosyaları veya ben ilgileniyorum satırları döndürür. Ben yanlış yapıyorum

?

Teşekkürler!

cevap

31

word_1 öğesini bulmak istediğiniz her şeyi, herhangi bir sayıyı, ardından word_2 takip edin. Yani Bunu genellikle komut satırı aramalarda kullanıldıkça * kullanıyor görünüyor

word_1.*word_2 

olabilir, ama regexes içinde en az 0 kere maçı anlamına gelen o önceki karakter için nicelik olduğunu olmalıdır. Örneğin, a* regex 0 veya daha fazla a s ile eşleşir, oysa a+ regex en az bir a eşleşir.

"şey maç" anlamına regex meta karakter o kadar .* şey, herhangi bir kaç kez maç" anlamına gelir, . olduğunu. Konu hakkında kısa bir tanıtım perlrequick bakınız.

+0

teşekkürler! @dsolimano arasında herhangi bir fark olur muydu ne yazdın ve: '. * word_1. * word_2' Eğer değilse, neden? –

+1

Sırala, ama baktığın şey için değil. Bu, hatta kelime wordünden önce her şeyle eşleşir. Eşleştiğinde, eşleşip eşleşmediğine göre, maçta daha fazla şey görürsünüz.Çok paranız ve zamanınız varsa, Friedl'in "Mastering Regular Expressions" bölümünü okumanızı tavsiye ederim. – dsolimano

İlgili konular