2012-07-03 3 views
2

Использование Ruby Я бы хотел взять объект Regexp (или строку, представляющую действительное регулярное выражение, ваш выбор) и сделать токенизацию так, чтобы я мог манипулировать определенными частями.Tokenize (lex? Parse?) Регулярное выражение

В частности, я хотел бы взять регулярное выражение/строку, как это:

regex = /var (\w+) = '([^']+)';/ 
parts = ["foo","bar"] 

и создать строку замены, которая заменяет каждый захват с буквальным из массива:

"var foo = 'bar';" 

A метод наивного регулярного выражения для анализа регулярного выражения, например:

i = -1 
result = regex.source.gsub(/\([^)]+\)/){ parts[i+=1] } 

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

Есть ли существующий парсер Regex для Ruby? Есть ли (ужас ужасов) известное регулярное выражение, которое чисто соответствует регулярным выражениям? Есть ли камень, который я не нашел?

Мотивация по этому вопросу - это желание найти чистый и простой ответ на вопрос this question.

+1

Интересный вопрос. Являются ли регулярные выражения регулярными выражениями сами? –

+0

@ acheong87 Учитывая произвольно-вложенные группы захвата, я думаю, что нет. Однако мои знания о формализме вокруг обычных языков очень ограничены. – Phrogz

+0

Вы изучили интерполяцию переменных регулярных выражений? – iain

ответ

2

У меня есть проект JavaScript на GitHub: Dynamic (?:Regex Highlighting)++ with Javascript!, который вы можете посмотреть. Он анализирует регулярные выражения, совместимые с PCRE, написанные как в режимах свободного пробега, так и без свободного пробега. Поскольку регулярные выражения написаны в синтаксисе JavaScript с менее функциональными характеристиками, эти регулярные выражения могут быть легко преобразованы в Ruby.

Обратите внимание, что регулярные выражения могут содержать произвольно вложенные структуры круглых скобок, а JavaScript не имеет рекурсивных функций регулярного выражения, поэтому код должен анализировать дерево вложенных парсов из-внутри-out. Это немного сложно, но работает достаточно хорошо. Не забудьте попробовать его на highlighter demo page, где вы можете вводить и динамически выделять любое регулярное выражение. Регулярные выражения JavaScript, используемые для анализа регулярных выражений, документируются here.

Смежные вопросы