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, ...)
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 è.|
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.