2015-08-01 20 views
7

Come si può scrivere una regex per rimuovere tutte le coppie di parentesi che non contengono nulla?PCRE regex per rimuovere le parentesi graffe vuote

Ad esempio, {} e {{}} deve essere ridotta a una stringa vuota, ma {{} diventa { e {{A}{}} diventa {{A}}.

Attualmente sto eseguendo s/\{\}//g in un ciclo fino a quando la lunghezza della stringa è fissa, ma c'è un modo migliore per farlo?

+4

abbinabili coppie bilanciate è uno dei problemi più difficili regex. Fortunatamente, PCRE ha un'estensione per affrontarlo. Questa risposta potrebbe aiutare. https://stackoverflow.com/questions/5410652/regex-delete-contents-of-square-brackets – Schwern

risposta

10

La corrispondenza di coppie bilanciate utilizzando le espressioni regolari tradizionali è difficile, se non impossibile. Fortunatamente PCRE e altri hanno un'estensione corrispondente in modo ricorsivo, (?R) corrisponderà ricorsivamente all'intero modello.

/\{(?R)*\}/ 

Che dice di abbinare coppie di controventi che hanno zero o più coppie di controventi al loro interno. Vedere perlretut->Recursive patterns e perlre->Extended Patterns->?R per ulteriori informazioni.

2

Senza ricorsione:

1 while s/\{\}//g;