!rm`.*$
Tek bir regex ile, Retina Maç modunda çalışır. Bu normalde yalnızca eşleşme sayısını yazdırır, ancak !
bunun yerine gerçek eşleşmeleri yazdırmak üzere yapılandırırız (satır beslemeleri ile ayrılmış).
Gerçek regex sadece .*$
. .*
satırlar .
dışında herhangi bir karakterle eşleşebileceğinden herhangi bir satırla eşleşebilir (potansiyel olarak boş) . $
Bir dakika içinde içeri gireceğim.
Kibritleri tersten nasıl yazdırabiliriz? .NET'in sağdan sola eşleme modunu kullanarak, ile etkinleştirilir r
. Bu, regex motorunun, eşleşmeleri ararken geriye doğru çalıştığı ve dizenin sonunda başladığı anlamına gelir.
Son olarak, m
make $
eşleşmeyi dizenin sonu yerine satırın sonuna getirir . Neden buna ihtiyacımız var? Sorun, .*
yabancı eşleşmeler yaratmasıdır. Regex ikamesini düşünün
s/a*/$0x/
girişe uygulanır baaababaa
. Bunun sonuç vereceğini düşünürsün baaaxbaxbaax
, ama aslında sana verir baaaxxbaxxbaaxx
. Niye ya? Çünkü aaa
motorun imleci eşleştikten sonra a
ve arasındadır b
. Şimdi daha fazla a
s eşleşemiyor, ancak a*
boş bir dize ile de tatmin oluyor. Bu, her bir maçtan sonra başka bir boş maç elde edeceğiniz anlamına gelir.
Bunu istemiyoruz, çünkü ek boş satırlar ortaya koyacağından, bu yabancı eşleşmeleri ( satırın başlangıcında , sağdan sola modu nedeniyle) eşleştirmelerin sona ermesini isteyerek atarız. çizgi.
tac
izleyen satır sıkıntısı söz konusu olduğunda biraz garip. Bu dönüşümleria\nb\n
içerisine (arka LF)b\na\n
vea\nb
içine (Sonunda satır besleme)ba\n
. Bizim kodumuz böyle mi davranmalı?