LINUX.ORG.RU

Рекурсивный матчинг вложенных скобок

 ,


1

2

Строку, которая должна соответствовать шаблону, см. в самом коде:

my %p=('('=>')','{'=>'}');
my $a='fg{}hg (  (gh{jkjk} (h) g (llh) ) ( (jkj) (k(l h{} jhjhj )k) k) kkk) jkjkj (aaa)';
print "hello\n" 
 if $a=~m/^((?>[^({})]*)(?:([({])(?-2)(??{ '\'.$p{$2} })(?>[^({})]*))*)$/;

Вопрос: работает-то оно работает, но можно ли было проще сделать?

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 2)

работает - не трожь! :)

bvn13 ★★★★★
()

Can't find string terminator «'» anywhere before EOF

Deleted
()
/^((?>[^({})]*)(?:([({])(?-2)(??{ '\'.$p{$2} })(?>[^({})]*))*)$/

Да куда уж проще?

Ты бы хоть регулярку на строки разбил, а то сразу вспоминается «echo test... test.... test...».

DELIRIUM ☆☆☆☆☆
()

Ты свой код тестируешь так? :)

gh0stwizard ★★★★★
()
Ответ на: комментарий от DELIRIUM

Ты бы хоть регулярку на строки разбил, а то сразу вспоминается «echo test... test.... test...».

Эмм... Сорри, это я из однострочника просто выдернул :) Тестирую я такие вещи в perl -e обычно

DRVTiny ★★★★★
() автор топика

Парсить вложенные скобки регекспами - да вы поехавшие. Один проход по строке + стек для скобок.

vasilenko ★★
()
Ответ на: комментарий от DRVTiny

http://bash.im/quote/431836

А вообще тебе ниже правильно посоветовали, сделай строке split и напиши посимвольных обход, не извращайся с регуляркой, не тот случай.

DELIRIUM ☆☆☆☆☆
()

-- joke mode on

С рекурсивным матчингом вложенных скобок лучше всего справится Lisp! :)

necromant ★★
()

ну вообще матчинг вложенных скобок это не регулярная грамматика.

так что одних регеспов не хватит.

dimon555 ★★★★★
()
Ответ на: комментарий от beastie

Проще самому написать парсер, чем изучать другой язык (yacc).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.