2016-03-28 11 views
3

ALL (veya bunların herhangi biri) içeren desenleri bulmak için ack ile nasıl arama yapılır? ack - birden fazla model için arama (mantıksal AND)

HERHANGİ (OR) gibi kolaydır: VE (ALL) yazmak için

ack 'pattern1|pattern2|pattern3' 

ama nasıl? Örneğin. Aşağıdaki kod nasıl yazılır:

if($line =~ /pattern1/ && $line =~ /pattern2/ && $line =~ /pattern3/) { 
    say $line 
} 

ack?

Veya daha doğrusu, logical and ile bir regex oluşturmak mümkün mü?

cevap

5
/foo/s && /bar/s && /baz/s 

Biz aslında son için önceden göz gerekmez

/^(?=.*?foo)(?=.*?bar)(?=.*?baz)/s 

olarak yazılabilir bir.

/^(?=.*?foo)(?=.*?bar).*?baz/s 

Ve birden fazla varsa biz eşleştirilir modelin hangi örneği umurumda değil, çünkü biz

/^(?=.*foo)(?=.*bar).*baz/s 
2

En basit çözüm ack zincirlenmiş görüşmesi ile ilerici filtreleme uygulamaktır:

$ ack pattern1 | ack pattern2 | ack pattern3 | ... 
+0

evet o kolaylaştırabilirsiniz; bu 'grep' ile mümkündür) çok. Bir ack koşusunda mümkün değil mi? - Örneğin. Perl-regexler bir şeyi 'AND' olarak bilmiyor mu? – cajwine

+1

@cajwine: Düzenli ifadeler mantıksal değil, desen yapar. Biraz pedantic olmak için: bir regex içinde '|', "alternatifi", "değil" anlamına gelir. Bir "ve" için hiçbir meta karakter yoktur, çünkü bu örtük varsayılantır. Örneğin. "ab" deseni, "a" karakterini ve "b" karakterini (bu sırayla ve birbirine bitişik) eşleştirmeyi gerektirir. Birden fazla desen eşleştirmek, birden fazla eşleşme gerektirir (amfetamachine cevabında olduğu gibi) veya kalıpları tek bir tanede birleştirir (ikegami'nin cevabında olduğu gibi). –