2011-08-19 15 views
8

jQuery kaynak kodunda bu normal ifadede geldi: oldukça karışıktı nedenBu normal ifade kısmı ne ekler?

... 
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, 
... 

merak ediyordum. İkinci kısmına arkasında nedenle özellikle ilgilendiğim: Ben biraz araştırma yaptım ama

(?:.*? rv:([\w.]+))? 

Ben normal ifadenin bu kısmı ekler anlamaya olamazdı.

(?:)  to match but not capture 
.*?  any amount of any character 
rv:  something literal 
([\w.]+) one or more word characters or a dot 
?   appear 0 or 1 time 

Özellikle bu son ? bana çok mantıklı değil. İkinci bölüm, o ikinci bölüm tarafından tanımlandığı gibi bir alt-tabaka varsa ya da mevcut değilse eşleşir. Bazı deneme ile ve düzenli ifade sadece farklı görünmüyor hatası:

/(mozilla)/ 

birisi normal ifadenin ikinci bölümü yapmak gerekiyordu ne ışık tutabilecek misiniz? Ne kısıtlıyor; /(mozilla)/ veya diğer yoldan geçen dizi ne başarısız?

+0

Ben kendi kullanıcı aracısı dizesi koyarak Mozilla taklit bazı tarayıcılar etrafında çalışmak şüpheli. –

+0

Biraz daha bağlam sağlayabilir misiniz? JQuery eklentisinin bu kısmı mıydı? Eğer öyleyse, hangisi? Bu kodun nerede göründüğünün bilinmesi, yazara/ışığa/yazara ışık tutabildi ve yazar bu belirli deseni istediği için, bu yüzden de desen ne yapıyordu. – jefflunt

+0

@Rafe Kettler: Seni doğru anladığımdan emin değilim. Regexp, sahtekarları önlemek için ne yapar? – pimvdb

cevap

4

dize için

: mozilla asdf rv:sadf

/(mozilla)(?:.*? rv:([\w.]+))?/ 
$0 = 'mozilla asdf rv:sadf' 
$1 = 'mozilla' 
$2 = 'sadf' 

/(mozilla)/ 
$0 = 'mozilla' 
$1 = 'mozilla' 
$2 = '' 
1

(?:.*? rv:([\w.]+))'un içinde ([\w.]+) yakalanıyor, bu nedenle geçmişte revizyon numarasını almak için bu regex kullanıldı (ancak, şu anda jquery'nin yalnızca normal ifadelerle eşleşip eşleşmediğini kontrol ediyor gibi görünüyor).

2

Birincisi, arasındaki farkı açıklamak istiyorum:

.*? - non-greedy match 
.* - greedy match 

(arama dizesi geri kalanı verilen) olası bayt az sayıda maç olacak olmayan açgözlü ve hırslı biri olacak en çok eşleştir.

mozilla some text here rv:abc xyz 

regex 'mozilla' ve 'abc' hem döndürür:

dize göz önüne alındığında. Fakat 'rv:' yoksa, normal ifade 'mozilla' geri dönecektir. İki regex aynı dizeyle eşleşir, ancak yakalama gruplarına farklı bilgiler depolar.

+0

Doğru, ancak genellikle "açgözlü" ve "açgözlü" olarak adlandırılırlar. –

+0

Evet. Hafızam biraz komik. Ben düzenleyeceğim –

0

(pat) bir tam içerdiği desen eşleştirme için bir desen sınırlayıcı olduğunu.(?: Pat), yukarıdaki gibi değil, [] karakter kümesi köşeli parantez [^] 'nin olumsuzlamasıdır. Javascript'te, ile olumsuzlama gerçekleşir! . herhangi bir karakterle eşleşir, * eşleşmelerin bir ölçütüdür ve daha yeni Regex Engines'de {0,} olarak yazılabilir (ancak bu üç ek karakter muhtemelen klavyenizin daha erken ölmesine neden olabilir!) ? gereksiz maç nicelik: sıfır ya da bir süresi rv eşleşebilir: ([. \ w] +) .... hazır rv

bir submatch, üst eşleşme içinde sıfır veya bir saat ile aynı olabilir)? [\ w.] ...karakter kümesi, "w" ile "w": herhangi bir alfanümerik karakter, aka [a-zA-Z0-9_] ve ardından bir literal nokta ve eşleşme nicelendiricisi +, bir veya daha fazla kez oluşabilir

Tersine mühendis için desen eşleşmesinin anlamı: sadece bir metin düzenleyicide sağdan sola doğru değerlendirme yapın ve harfleri akla gelen ve her alt ifadenin eşleştiği rastgele değişmez sözcüklerle değiştirin. Ardından bir adım geri atın ve regex'in ne için olabileceğini düşünün.

+1

Lütfen SO'ın [kod biçimlendirme] (http://stackoverflow.com/editing-help#code) özelliğinden yararlanın; şimdi olduğu gibi, cevabınız neredeyse okunamıyor. –

+1

Yanıt ayrıca aşağıdakileri de içeren birkaç hata içeriyor: ** 1. ** '(pat)' bir yakalama grubudur; ** 2. ** (?: Pat) 'bir * olmayan yakalama * grubudur, ima ettiğiniz gibi olumsuz bir bakış değil ('(?! Pat)' olacaktır); ** 3. ** '' 'hemen hemen tüm normal ifadelerde' {0,} 'a eşdeğerdir - yaşın onunla hiçbir ilgisi yoktur; ** 4. ** bu ilk '' 'önceki' '' isteksiz (gereksiz değil) yapar; ** 5 [**] [\ w.] ', [A-Za-z0-9 _.]' Ile eşdeğerdir (yani, bir kelime karakteriyle * veya bir noktayla eşleşir; Dediğin gibi. –

2

Not: Şimdi bu cevabın kapsam dışı olabileceğini fark ettim. Daha fazla bilgi için hala ayrılmaya devam edeceğim, ancak kapsamın çok fazla olduğunu düşünüyorsanız, sadece yorum ve onu kaldıracağım.


@arnaud haklı, sürümü almaktır.

uaMatch: function(ua) { 
    ua = ua.toLowerCase(); 

    var match = rwebkit.exec(ua) || 
       ropera.exec(ua) || 
       rmsie.exec(ua) || 
       ua.indexOf("compatible") < 0 && rmozilla.exec(ua) || 
       []; 

    return { browser: match[1] || "", version: match[2] || "0" }; 
}, 

Sen bulundu ve 0 değilse IF_FUNCTION sürümünü döndürür görebilirsiniz: ifadeler kullanılır Here is the code. Bu, bazı tarayıcılar için gerekli olabilir veya geliştiriciler için ek bilgi olarak sağlanmıştır.

işlev here denir:

browserMatch = jQuery.uaMatch(userAgent); 
if (browserMatch.browser) { 
    jQuery.browser[ browserMatch.browser ] = true; 
    jQuery.browser.version = browserMatch.version; 
}