PCRE регулярен израз за премахване на празни скоби

Как може да се напише регулярен израз, за ​​да се премахнат всички двойки скоби, които не съдържат нищо?

Например {} и {{}} трябва да се редуцират до празен низ, но {{} става {, а {{A}{}} става {{A}}.

В момента изпълнявам s/\{\}//g в цикъл, докато дължината на низа не бъде фиксирана, но има ли по-добър начин да направя това?


person user5179929    schedule 01.08.2015    source източник
comment
Съпоставянето на балансирани двойки е един от най-трудните проблеми с регулярните изрази. За щастие PCRE има разширение за справяне с него. Този отговор може да помогне. stackoverflow.com/questions/5410652/   -  person Schwern    schedule 01.08.2015


Отговори (2)


Сравняването на балансирани двойки с помощта на традиционни регулярни изрази е трудно, ако не и невъзможно. За щастие PCRE и други имат разширение за рекурсивно съвпадение, (?R) рекурсивно ще съвпада с целия шаблон.

/\{(?R)*\}/

Това означава да съпоставите двойки скоби, които имат нула или повече двойки скоби в себе си. Вижте perlretut->Рекурсивни модели и perlre->Extended Patterns->?R за повече информация.

person Schwern    schedule 01.08.2015

Без рекурсия:

1 while s/\{\}//g;
person Borodin    schedule 01.08.2015