2015-06-06 25 views
7

L'espressione regolare PCRE /..(?<=(.)\1)/ non riesce a compilare: "I riferimenti Subpattern non sono consentiti all'interno di un'asserzione." È interessante notare che sembra essere accettabile in lookaheads, come /(?=(.)\1)../, non solo in lookbehinds.PCRE: le backferger non sono consentite nei lookbehinds?

Esiste un motivo tecnico per cui i backreferences non sono consentiti specificamente per le schermate?

+0

I backreferences in genere non possono essere utilizzati all'interno di look-behind. Sebbene sia possibile una soluzione, '.. (? <= (? = (.) \ 1))' – hwnd

+0

Mi chiedo perché, in particolare. E sembra sempre più strano che anche '/ .. (? <= (.) (? = \ 1).) /' È accettato, quando '/ .. (? <= (.) \ 1) /' non è . –

+1

È perché i subpattern di lunghezza variabile non sono consentiti in un lookbehind. Dal momento che un backreference può avere una lunghezza qualsiasi, non è ammesso neanche in una vista. Con pcre, la soluzione classica (quando possibile) è usare la funzione '\ K'. –

risposta

3

Con il modulo re di Python, i riferimenti di gruppo non sono supportati in lookbehind, anche se corrispondono a stringhe di lunghezza fissa.


Lookbehinds non supporta completamente le regole PCRE. Concretamente, quando il motore regex raggiunge uno sguardo dietro, cercherà di determinarne la dimensione, quindi tornerà indietro per controllare la partita.

determinazione

Questa dimensione ti porta a una scelta:

  • permettono dimensione variabile, allora ogni lookbehind deve essere eseguito prima di fare un salto indietro
  • non consentire dimensioni variabili, allora possiamo passare direttamente indietro

Poiché la prima soluzione sarebbe la migliore per noi (utenti), è ovviamente la più lenta e la più difficile da sviluppare. E così per la regex PCRE, hanno deciso di utilizzare la seconda soluzione. Il motore regex di Java, per un altro esempio, consente le schermate semi-variabili: è sufficiente determinare la dimensione massima.


Sono venuto a modulo re PCRE e Python di.
Non ho trovato niente altro in PCRE documentation di questo codice di errore:

CODICI DI COMPILAZIONE DI ERRORE
25: asserzione lookbehind non è fisso lunghezza

Ma in questo caso, l'affermazione lookbehind è lunghezza fissa.
Ora, ecco cosa possiamo trovare in re documentation:

Il modello contenuto deve corrispondere solo stringhe di una certa lunghezza fissa, il che significa che abc o un | b sono ammessi, ma a * e {3,4 } non sono. I riferimenti di gruppo non sono supportati anche se corrispondono a stringhe di lunghezza fissa.

Abbiamo il nostro colpevole ... Se si vuole, si può provare la Python's regex module, che sembra sostenere lookbehind lunghezza variabile.

+0

Hai qualche riferimento per dimostrare il tuo punto? Forse qualche estratto dal codice sorgente PCRE? Sembrerebbe più convincente. –

+0

@stribizhev Ho trovato l'origine, in profondità nella documentazione. – zessx