2010-05-14 12 views
13

Questa interessante domanda Regex to match anything (including the empty string) except a specific given string riguarda come eseguire un look-out negativo in MySQL. Il poster ha voluto per ottenere l'effetto diCome convertire un PCRE in POSIX RE?

Kansas(?! State)

perché MySQL non implementa asserzioni look-ahead, un certo numero di risposte si avvicinò l'equivalente

Kansas($|[^ ]| ($|[^S])| S($|[^t])| St($|[^a])| Sta($|[^t])| Stat($|[^e]))

Il poster ha sottolineato che è una PITA da fare per potenzialmente molte espressioni.

Esiste uno script/utilità/modalità di PCRE (o qualche altro pacchetto) che convertirà un PCRE (se possibile) in una regex equivalente che non utilizza le caratteristiche snelle di Perl? Sono pienamente consapevole che alcune regex in stile Perl non possono essere dichiarate come espressioni regolari, quindi non mi aspetto che lo strumento faccia l'impossibile, ovviamente!

+0

anni fa Ho visto uno strumento per convertire un'espressione regolare in NFA o DFA e tornare a un'espressione regolare, ma non riesco a trovarlo in questo momento. Questo strumento permetteva l'intersezione e il complemento delle espressioni regolari degli input, mentre IIRC l'espressione regolare ricostruita non utilizzava questi costrutti. –

+15

Vale la pena notare che le due espressioni regolari nella domanda non sono esattamente equivalenti: sebbene entrambe facciano la stessa cosa nell'esempio originale, in alcune circostanze si comportano diversamente. Ad esempio, se usato in una sostituzione (ad esempio sostituendo 'Kansas' con' Home' nella stringa 'Kansas Starbucks'), il primo darà' Home Starbucks', mentre il secondo darà 'Homebucks'. A questo proposito, non è possibile avere un'espressione regolare POSIX standard che riproduca esattamente l'aspetto negativo. – psmears

risposta

2

Non si vuole fare questo. Non è in realtà difficile da interpretare in modo complicato tradurre le funzioni avanzate in funzioni base - è solo un altro aspetto del compilatore, e gli scrittori di compilatori sono persone abbastanza intelligenti - ma la maggior parte delle cose che le snelle funzioni risolvono sono (a) impossibili da fare con un regex standard perché riconoscono le lingue non regolari, quindi dovresti approssimarle in modo che almeno funzionino per un testo di lunghezza limitata o (b) possibile, ma solo con un'espressione regolare di dimensioni esponenziali. E 'esponenziale' è compsci-speak per "non andare lì". È impoverito in errori OutOfMemory e loop apparentemente infiniti se si tenta di utilizzare una soluzione esponenziale su tutto ciò che si desidera effettivamente elaborare.

In altre parole, abbandonate ogni speranza, voi che entrate qui. È praticamente sempre meglio lasciare che la regex faccia ciò che è buono e faccia il resto con altri strumenti. Anche una semplice cosa come invertire una regex è molto, molto più facile risolto con la regex originale in combinazione con l'operatore di negazione che con la mostruosità che deriverebbe da un inverter regex accurato.

Problemi correlati