Regex motorlarını uygulamanın arkasındaki pragmatik konulardaki yetkili referans, Russ Cox'un üç blog yazısından oluşan bir seridir . Burada açıklandığı gibi, geri referanslar dilinizi düzenli yapmadığından, geri izleme kullanılarak uygulanırlar .
Regex desen eşleştirme motorlarının birçok özelliği gibi, lookaheads ve lookbehinds, bir dize bir dilin bir üyesi olup olmadığına karar verme paradigmasına pek uymuyor. Regex'ler yerine genellikle daha büyük bir dizgede alt dizgileri arıyoruz. "Eşleşmeler", dilin üyeleri olan alt dizelerdir ve dönüş değeri, alt dizenin daha büyük dize içindeki başlangıç ve bitiş noktalarıdır.
Bakış açılarının ve bakış açılarının noktası, normal olmayan dilleri eşleştirme yeteneğini ortaya koymak için çok değil, motorun eşleşen alt tablonun başlangıç ve bitiş noktalarını rapor ettiği yeri ayarlamaktır.
Http://www.regular-expressions.info/lookaround.html adresindeki açıklamaya güveniyorum . Bu özelliği destekleyen regex motorları (Perl, TCL, Python, Ruby, ...) hepsi geri izlemeye dayanıyor gibi görünmektedir (yani, normal dillerden çok daha büyük bir dil grubunu desteklemektedir). Bu özelliği, görevi gerçekleştirmek için gerçek sonlu otomatlar oluşturmaya çalışmak yerine, geri izlemenin nispeten "basit" bir uzantısı olarak uyguluyorlar.
Olumlu Bakış
Sözdizimi pozitif lookahead olduğunu (?=
regex)
. Yani, örneğin q(?=u)
maçları q
bunun ardından yalnızca u
, ama uymuyor u
. Bunu, geri izleme üzerinde bir değişiklikle uyguladıklarını hayal ediyorum. Pozitif görünümden önceki ifade için bir FSM oluşturun. Bu eşleşmeler nerede bittiğini hatırlayın ve pozitif görünüm içindeki ifadeyi temsil eden yeni bir FSM'yi başlatın. Eğer bu eşleşirse, o zaman bir "eşleşme" ye sahip olursunuz, fakat eşleşme "pozitif" görünüş eşleşmesinin başladığı pozisyondan hemen önce biter.
Bunun geri izlemeden zor olacak olan tek kısmı, bakışın başladığı girişteki noktayı hatırlamanız ve eşleştirme işlemini tamamladıktan sonra giriş bandınızı bu konuma geri getirmeniz gerektiğidir.
Olumsuz Bakış
Sözdizimi negatif lookahead olduğunu (?!
regex)
. Dolayısıyla, örneğin sadece takip etmiyorsa q(?!u)
eşleşir . Bu, ya başka bir karakter tarafından takip edilebilir ya da dizenin en sonundaki bir olabilir. Bunun, lookahead ifadesi için bir NFA oluşturarak, ardından sadece NFA'nın sonraki dizgiyi eşleştirememesi durumunda başarılı olacağını düşünüyorum.q
u
q
q
Eğer geriye dönüşe güvenmeden yapmak istiyorsanız, lookahead ifadesinin NFA'sını ihmal edebilirsiniz, o zaman ona pozitif lookahead ile aynı şekilde davranın.
Olumlu Lookbehind
Sözdizimi Pozitif Geriye İlerleme olduğunu (?<=
regex)
. Bu nedenle, örneğin, (?=q)u
eşleşir u
, ancak yalnızca ondan önce gelirse q
, eşleşmezse q
. Görünüşe göre bu, regex motorunun gerçekte karakterlerini yedeklediği ve regex'i bu karakterleriyle eşleştirmeye çalıştığı tam bir hack olarak uygulanmaktadır . Bu, regex'in yalnızca uzunluğu ile aynı olacak şekilde olması gerektiği anlamına gelir .n nnnn
Bunu, regex ile biten "string" in kesişimini , lookbehind operatöründen önce gelen regex'in hangi kısmıyla olursa olsun alarak tekrar izlemeden uygulayabilirsiniz. Bu Geriye dönük çünkü zor olsa olacak regex girişinin cari başından daha ileriye geri bakmak gerekebilir.
Olumsuz Bakış
Sözdizimi Negatif Geriye İlerleme olduğunu (?<!
regex)
. Dolayısıyla, örneğin (?<!q)u
eşleşir u
, ancak bundan önce gelmemişse q
. O eşleşir Yani u
içinde umbrella
ve u
içinde doubt
değil u
de quick
. Yine, bu, regex'in uzunluğunu hesaplayarak, birçok karakteri yedekleyerek, regex ile eşleşmeyi test ederek , ancak gözbebeki eşleşirse tüm eşleşmeyi kaldırarak yapılıyor gibi görünüyor.
Sen inkarını alarak geriye olmadan bu uygulamaya mümkün olabilir regex ve Pozitif Geriye İlerleme için yapacağı gibi daha sonra aynı şeyi.