2015-06-06 41 views
7

PCRE regex'i /..(?<=(.)\1)/ derlenemiyor: "Alt belgenin başvurularında bir alt belgenin kullanılmasına izin verilmiyor." İlginç bir şekilde, /(?=(.)\1)../ gibi lookahlarda, sadece lookbehinds içinde kabul edilemez gibi görünüyor.PCRE: backreferences lookbehinds izin verilmiyor?

Geri tepme özelliklerinin özellikle lookbehind'lere izin verilmemesinin teknik bir sebebi var mı?

+0

Backreferences genellikle arka planda kullanılamaz. Her ne kadar, bir geçici çözüm mümkün olsa da, '.. (? <= (? = (.) \ 1)) – hwnd

+0

Nedenini merak ediyorum, özellikle. Ve hiç de yabancı görünmüyor ki, '/ .. (? <= (.) (? = \ 1).)/'Kabul edildiğinde,/.. (? <= (.) \ 1) /' ise . –

+1

Bunun nedeni, değişen uzunluk alt şablonlarının bir görünümde izinli olmamasıdır. Bir backreference herhangi bir uzunluğa sahip olabileceğinden, bir lookbehind de izin verilmez. PCre ile klasik çözüm (mümkün olduğunda) '\ K' özelliğini kullanmaktır. –

cevap

3

Python'un yeniden modülünde, belirli sabit uzunlukta dizelerle eşleştikleri halde grup referansları lookbehind'de desteklenmez.


Lookbehs, PCRE kurallarını tam olarak desteklemez. Somut olarak, regex motoru bir lookbehind'e ulaştığında, boyutu belirlemeye çalışacak ve ardından maçı kontrol etmek için geri atlayacaktır.

Bu boyut belirleme seçimi getirir:

  • izin değişken boyut, daha sonra ihtiyacı yürütülecek olan ileriye dönük her geri
  • değişken boyutu izin vermemek
  • atlamak için önce, o zaman doğrudan
geri atlayabilir

İlk çözüm, bizim için (kullanıcılar) en iyi çözüm olacak gibi, en açık ve en zor olanıdır. Ve böylece PCRE regex için, ikinci çözümü kullanmaya karar verdiler. Başka bir örnek için Java regex motoru, yarı değişken bakış açılarına izin verir: sadece maksimum boyutu belirlemeniz gerekir.


Ben PCRE'nin ve Python'un yeniden modülüne geldi.
Bu hata kodu daha PCRE documentation başka bir şey bulunamadı ettik:

DERLEME HATA KODLARI
25: modelleri geriye dönük onaylama işlemi uzunluk

sabit Ama değil bu durumda örnek olarak geriye dönük iddiası sabit uzunlukta.
Şimdi, işte re documentation bulabileceğiniz budur:

içerdiği desen sadece abc veya yani bazı sabit uzunlukta dizeleri aynı olmalıdır | b izin verilir, ancak a * ve {3,4 } değiller. Grup referansları, belirli bir sabit uzunluktaki dizelerle eşleştikleri halde desteklenmezler.

Size isterseniz, değişken uzunluk olan ileriye dönük destekler gibi görünüyor Python's regex module, deneyebilirsiniz ... bizim suçlu var.

+0

Amacınızı kanıtlamak için herhangi bir referansınız var mı? Belki de PCRE kaynak kodundan bazı alıntılar? Daha ikna edici geliyor. –

+0

@stribizhev Dökümde kökeni buldum. – zessx

İlgili konular