2011-11-14 2 views
1

У меня есть куча коротких строк в схеме:регулярное выражение или сканер

<text @varible1 more text><, @variable2 text ><@variable3 text text> 

@variableN являются держателями место, каждая скобка является «раздел», который указывает на то, что если приложенная varibale пустая строка , «раздел» будет отсутствовать. Я думаю использовать регулярное выражение для извлечения каждого раздела, а затем повторно собрать всю строку на основе того, является ли соответствующая переменная пустой или нет. Например, если я прохожу @ variable1 = «привет» @ variabl3 = «мир» вся строка должен возвращать как:

text hello more text, world text 

Сначала я подумал, что я мог бы использовать достаточно регулярные выражения трюков, чтобы получить работу. Затем я обнаружил, что «секции» могут входить в гнездо, а также мне нужно избегать нескольких специальных символов, таких как, очевидно, «<», «>» и «@». Чем больше я думаю об этом, тем больше мне кажется DSL. Может быть, разработка сканера была бы лучшей идеей? Я немного знаю о написании парсеров. Поэтому я немного застрял, не знаю, куда идти.

Если у кого-либо есть опыт в этом сценарии, прошу пролить свет на него. Благодарю.

Синтаксис Примеры

<text @varible1 more text><, @variable2 text ><@variable3 text text> 
<text @varible1 more text><, @variable2 <, @nestedVaraible> text \<@userName\> > # with nesting and escaping 
<text @varible1 more text><, @variable2 text ><@variable3 \@twitterAccount> # escaping‘@ 

»

+0

Возможно, вам будет проще направить вас, если вы укажете язык, который вы используете. Возможно, у кого-то есть что-то настраиваемое, которое вы можете использовать. Конечно, звук звучит как проблема парсера. – fncomp

+0

PHP или Python будет в порядке. – Shawn

+0

Gotcha, можете ли вы опубликовать несколько строк, чтобы я мог получить суть вашего синтаксиса. Вероятно, я собираюсь предложить адаптировать [BeautifulSoup] (http://www.crummy.com/software/BeautifulSoup/documentation.html). – fncomp

ответ

1

Для этого вы можете использовать регулярные выражения PHP, но если вы открываете идею написания парсера, я думаю, что это лучший способ инвестировать свое время. Вот самое простое регулярное выражение я придумал, чтобы соответствовать тексту:

$rgx = '~((?:[^<>\\\\]++|(?:\\\\.)++)++)|(<(?:(?1)|(?-1))*+>)~'; 

... и все, что делает разделить строку в скобках разделов против всего остального. И это только делает это на одном уровне; вы должны применить его рекурсивно к каждой секции в квадратных скобках, пока вы не выделите все вложенные разделы. Не говоря уже о всей другой обработке, которую вы должны сделать, начиная с поиска имен переменных. Regexes может быть удивительно мощным, но еще более удивительным является объем работы, которую вы оставили делать после того, как весь пот мозга вы вложили в создание регулярного выражения.

Регулярные выражения Python не так сильны, что, вероятно, хорошо, разочаровывает, хотя это относится к наркоманам регулярных выражений, подобных мне. : P Что это такое - pyparsing. Я никогда не использовал его сам, но продолжаю хорошо разбираться в этом. Это может быть именно то, что вам нужно.

2

Если вы вниз для написания собственного анализатора, который будет интересно для этого случая, то я бы проверить Douglas Crockford«ы JSLint. Он публикует весь код и имеет действительно хорошие комментарии.

Для чего-то более общего, я определенно проверил бы этот удобный вопрос SO: Writing a simple parser.

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