2010-06-01 8 views
62

Google Analytics'te bazı hedefler ayarlıyorum ve biraz normal ifade yardımı kullanabilirim.Başka bir kelime içeren bir dize için düzenli ifade Normal bir

Ben dize seçici = boyutunu içeriyor, ancak details.cfm

İÇERMEZ herhangi bir URL tespit edecek bir ifade oluşturmak istiyorum ben 4 URL'ler

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 

kullandığınızı varsayalım Bu ifadeyi kullanabileceğim başka bir dize içermeyen bir dize bulmayı biliyorum:

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

Ancak, seçicisine nasıl ekleneceğinden emin değilim = boyut bölümü.

Herhangi bir yardım çok takdir edilecektir!

cevap

86

Bu yapmalıyım:

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

^.*selector=size.*$ yeterince açık olmalıdır. İlk bit, (?!.*details.cfm) olumsuz bir görünümdür: dizgiyle eşleşmeden önce, dizenin "details.cfm" içermediğini kontrol eder (önceden herhangi bir sayıda karakterle).

+2

Bilginize, güzel için http://www.regexr.com/ kontrol Bu ifadeleri test etme yolu. –

+0

Parlak, bu yardımcı oldu. İyi bir açıklama – user219628

+0

Her zaman olumsuz bakışları unutun ve çok yararlıdır –

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

senin regex motoru (sanıyorum gerçi Google Analytics değil), o zaman bu büyük giriş için daha iyi performans göstereceğini tahmin setleri posessive nicelik desteklenir:

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

Bu, 'selector = size', her zaman, önceki url'de olmayan, details.cfm' önce her zaman olduğunu varsayar. – Kobi

+0

Sadece bunu temizlemek için, ben değildim. Birinin neden burada iki yanıtı reddedeceğini göremiyorum, ikisi de doğru. – Kobi

+0

@Kobi: Bu bir bakış, düzeltilmiş olmalıydı. Oh ve bu arada, senin oyların oy olduğundan şüphelenmedim. – Tomalak

5

regex (perl sözdizimi) olabilir : bunu yapmak için

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

Basit yolu takip

yaparak dize 0 örneklerini belirtmektir
+2

Bu işe yaramıyor. –

+0

bu sadece boş dizgeye değerlendirir; Alt dizenin oluşmadığından emin olmaz, ancak her zaman yaptığı boş dizenin oluşmasını sağlar. –

0

OP ve Kobi'nin çözümü benim için harika olan benzer bir durumda - kuyruk tamponlu bir kuyruktan kaçınmanın bir yolunu arıyordum. Benim durumumda "bot" veya "spider" içeren satırlar hariç tutulduğunda '/' (kök belgem için).

Benim orijinal komut:

Şimdi ("-P" perl anahtarı ile) olur
tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep '/' 

:

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'