2013-07-29 14 views
5

http://regexcrossword.com/ numaralı telefondan komik regex crosswords'lerini yaptım - ve ne anlama geldiğini anlamıyorum. (.) (.) + Veya *Regex, grup & quantifyer

o JavaScript ve PHP regex motoru sunuyor, beni http://ole.michelsen.dk/tools/regex.html de deneyelim: "Trololo"

karşı maç için dizedir (tırnak işaretleri olmadan). ("Küresel maçı" PHP modunda şey değişmedi olarak bir şey değişti, o, işte JS olduğu astarlanmış versiyonu olarak eklenir. Açmadan varsa)

JS, (.)+ => 0: Trololo! 1: ! 
JS', (.)+ => 0: Trololo! 
PHP, (.)+ => 0: Trololo! 0: ! 
JS, (.)* => 0: Trololo! 1: ! 
JS', (.)* => 0: Trololo! 
PHP, (.)* => 0: Trololo! 1: 0: ! 1: 
JS, (.){5} => 0: Trolo 1: o 
JS', (.){5} => 0: Trolo 
PHP, (.){5} => 0: Trolo 0: o 
JS, (.){4} => 0: Trol 1: l 
JS', (.){4} => 0: Trol 1: olo! 
PHP, (.){4} => 0: Trol 1: olo! 0: l 1: ! 

herhangi normatif cevap ne var mıdır Bunun semantiği nedir?

+0

JS ve JS nedir? Fark ne? –

+1

Sitenin size doğru grupları vermediğini düşünüyorum. Bunun yerine http://www.regexplanet.com/ adresini kullanın. –

cevap

3

Çıktılar doğru etiketlenmemiş, hepsi bu.

Her şeyden önce ne olur? Bir grubu tekrarlarsanız, her yeni örnek son yakalamanın üzerine yazar. Grup hiç kullanılmamışsa boş bir dize veya JS'de undefined gibi bir şey döndürecektir (bu, aromaya bağlıdır). Konuyla ilgili regular-expressions.info üzerinde iyi bir yazı var.

Şimdi sonuçlarınıza nasıl ulaşabiliriz? JavaScript ile başlayalım.

JS (global olmayanlar) etiketli tüm örnekler, yukarıdaki açıklamaya uymaktadır. İstenen karakter sayısını 0 ile eşleştirir ve son karakteri 1'da yakalarlar. Yani bunları görmezden gelebiliriz.

Genel olarak ne var? Burada çıktı yanlış yorumlandı. Küresel bayrağı String.match() işleviyle kullandığınızda, artık tüm yakalardan oluşan bir dizi elde edemezsiniz - ancak tüm eşleşmelerden oluşan bir dizi (her eşleşme için grup 0). Bu nedenle, sadece bir eşleşme olduğunda +, * ve {5} söz konusu olduğunda, yalnızca bir sonuç elde edersiniz. {4} ile hedef dizgede iki eşleşme için yeterli alan vardır, sonuçta oluşan dizi iki öğe içerir. Tüm yakalamaları küresel bayrakla elde etmek için bir döngü yazmanız ve bunun yerine RegExp.exec()'u kullanmanız gerekir (bu da size her seferinde bir eşleşme sağlar, ancak tüm yakalamaları).

Ve PHP ile neler var? Görünüşe göre, preg_match_all kullanıyorsunuz, bu da genel olarak, g'un kullanılmasının hiçbir etkisinin olmadığının nedeni. +, tekrar beklediğiniz sonucu verir. {5} da öyle.

Diğer ikisi ile ne var? Burada çıktı yanlış şekilde yorumlandı. Varsayılan olarak, preg_match_all, ilk dizinin gruba karşılık geldiği ve ikincisinin eşleşmeye karşılık geldiği iki boyutlu bir dizi verir. Çıktınızda, diğer yoldan yorumlanır. Bu nedenle, birden fazla eşleşme olduğunda, 0 ve 1'un ilk çifti, bulunan iki eşleşmenin tüm eşleşmesidir. 0 ve 1 ikinci çifti, bu iki eşleşmede yakaladığınız şeydir.

* için, önce tam dizeyi bir eşleşme olarak ve son karakteri yakalama olarak (0 etiketli iki şey), hangisi doğrudur. Ve sonra, * sıfır genişlikli eşleşmelere izin verdiğinden, boş bir yakalamayla birlikte dizenin sonunda başka bir (boş) eşleşme elde edersiniz.Uygun JS' örneğinin neden ek bir boş dize içermediğinden emin değilim, çünkü String.match aynı şeyi yapacaktır.

Ve {4} için

, sadece tekrar gayet olumlu yakalamaları sırasıyla l ve !, JavaScript örneğinde olduğu gibi iki maçı ( Trol ve olo!) olsun.

+0

> Her şeyden önce ne olmalı? Tam olarak, bu soru bekliyorum :-) Aslında beklediğim, abcd ile eşleşen (.) * 0 verir. Abcd 1. a 2. b 3. c 4. d - Yani, daha fazla grup aldım, niceleyici grubu ölçmek gibi görünüyor. Ama daha uzun düşünmek, o grup referansları düzeltmek gibi, hiç de kullanılabilir gibi görünüyor. – Falko

+1

@Falko, bunu yapan tek regex aroması. NET. Orada, her grup için bir Yakalama koleksiyonu içeren bir Grup nesnesi alırsınız. –

+0

Ah, havalı. Fakat bahsettiğim gibi, bunun pratikte nasıl faydalı olabileceğini hayal edemiyorum. – Falko