Çı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.
JS ve JS nedir? Fark ne? –
Sitenin size doğru grupları vermediğini düşünüyorum. Bunun yerine http://www.regexplanet.com/ adresini kullanın. –