Espressività delle moderne espressioni regolari


9

Di recente ho discusso con un amico di un sito Web che proponeva sfide regex, principalmente abbinando un gruppo di parole a una proprietà speciale. Stava cercando una regex che corrispondesse a stringhe come ||||||||dove il numero di |è primo. Gli dissi immediatamente che non avrebbe mai funzionato perché se una tale lingua fosse regolare, la traduzione del lemma di pompaggio darebbe il fatto che per un principale abbastanza grande, esiste tale che è il primo per tutti , e probabilmente non è affatto così (ripartizione dei numeri primi, banalità di una proprietà così sconosciuta e schiacciante, ...)pkpp+nkn1

Ma poi qualcuno è venuto con la soluzione: non corrisponde (||+?)\1+ Questa espressione cerca di far corrispondere il gruppo di acquisizione (che può essere ||, |||, ||||e così via di occorrenze di ) volte. Se corrisponde, significa che il numero rappresentato dalla stringa è divisibile per , e quindi non è un numero primo. Altrimenti lo è.k2|n2k

E mi sono sentito stupido, perché è diventato ovvio che il raggruppamento e il backreference consentono al regex di essere in realtà molto più espressivo di ... espressione regolare, in senso teorico. Ora hanno anche aggiunto lookaround e altri operatori di cui non sapevo quando ero solito fare regex reale.

Secondo Wikipedia, è ancora più espressivo che le lingue generate da una grammatica senza contesto. Quindi questa è la mia domanda :

  • possiamo rappresentare qualsiasi linguaggio algebrico (generato da una grammatica senza contesto) con i moderni motori di espressione regolare
  • c'è una descrizione più generale, o almeno un limite superiore alla complessità di che tipo di lingue può essere descritta da una regex moderna?

Più pragmaticamente, c'è qualche teoria seria dietro di essa o stiamo semplicemente aggiungendo nuove funzionalità come viene ogni volta che sembra implementabile al blocco iniziale di espressioni regolari reali basate su automi finiti?

So che la "regex moderna" non è molto specifica mentre la domanda è, ma intendo almeno con i riferimenti indietro, e forse di più. Ovviamente, se hai una risposta parziale che assume determinate restrizioni su questo linguaggio "regex moderno", sentiti libero di pubblicarlo.


1
Domanda correlata . Mi sembra di ricordare che almeno alcuni gusti RegExp sono Turing completi. Questo articolo può essere un valido punto di partenza per la ricerca in letteratura.
Raffaello

@Raphael grazie mille, l'articolo sembra rispondere a gran parte dei miei interrogatori
yago


Un motivo più forte per cui non tutti p + nk possono essere primi è che quando n = p, hai p + nk = p (1 + k).
Nathan FD,

Risposte:


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.