Bir kelime içeren ancak diğerini içermeyen bir dize için normal ifade


103

Google Analytics'te bazı hedefler oluşturuyorum ve biraz normal ifade yardımı kullanabilirim.

Diyelim ki 4 URL'm var

http://www.anydotcom.com/test/search.cfm?metric=blah&selector=size&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah2&selector=style&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah3&selector=size&value=1
http://www.anydotcom.com/test/details.cfm?metric=blah&selector=size&value=1

Seçici = boyut dizesini içeren ancak ayrıntılar İÇERMEYEN herhangi bir URL'yi tanımlayacak bir ifade oluşturmak istiyorum. Cfm

Başka bir dizge İÇERMEYEN bir dizge bulmak için şu ifadeyi kullanabileceğimi biliyorum:

(^((?!details.cfm).)*$)

Ancak, seçici = boyut bölümünü nasıl ekleyeceğimi bilmiyorum .

Herhangi bir yardım çok takdir edilecektir!

Yanıtlar:


144

Bunu yapmalı:

^(?!.*details\.cfm).*selector=size.*$

^.*selector=size.*$yeterince açık olmalı. İlk bit, (?!.*details.cfm)negatif bir önden bakmadır: dizeyle eşleşmeden önce dizenin "details.cfm" (ondan önce herhangi bir sayıda karakter) içermediğini kontrol eder.


8
Bilginize, bu ifadeleri test etmenin güzel bir yolu için regexr.com'a bakın.
Joshua Pinter

Negatif bakışları her zaman unutun ve bu çok kullanışlı
Alexei Blue

"http://www.anydotcom.com/test/search.cfm?metric=blah&selector=sized&value=1" =~ /^(?!.*details\.cfm).*selector=size.*$/ #=> 0yanlış. (Dizenin içerdiğine dikkat edin "...selector=sized...".) Ayrıca, neden .*$sonunda?
Cary Swoveland

4

normal ifade (perl sözdizimi) olabilir:

`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`

Bu bozuk bir normal ifadedir, köşeli parantezler tüm desen dizilerini ayrı karakterlerin kombinasyonuna dönüştürür.
Wiktor Stribiżew

2
^(?=.*selector=size)(?:(?!details\.cfm).)+$

Normal ifade motorunuz pozitif niceleyicileri destekliyorsa (Google Analytics'in desteklemediğinden şüphelenmeme rağmen), bu durumda büyük giriş kümeleri için bu daha iyi performans gösterecektir:

^[^?]*+(?<!details\.cfm).*?selector=size.*$

Bu selector=sizeher zaman önce olduğunu varsayar , details.cfmbu durum son url'de değildir.
Kobi

Bunu açıklığa kavuşturmak için, ben değildim. Burada birinin neden iki cevaba olumsuz oy verdiğini anlamıyorum, ikisi de doğru.
Kobi

@Kobi: Bu, düzeltilmiş bir ileri bakış olmalıydı. Oh ve bu arada, bunun sizin olumsuz oyunuz olduğundan şüphelenmedim.
Tomalak 01

0

--line-bufferedOP ve Kobi'nin çözümü benim için harika çalıştığından, benzer bir durumda kuyruktan kaçınmanın bir yolunu arıyordum . Benim durumumda, dahil ederken "bot" veya "örümcek" içeren satırları hariç tutmak' / ' (kök belgem için).

Benim orijinal komutum:

tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '

Şimdi ( -Pperl anahtarı ile) olur:

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.