C++, Boost regex, заменить функцию значения совпадающего значения?

В частности, у меня есть массив строк с именем val, и я хочу заменить все экземпляры "%{n}%" во входных данных на val[n]. В более общем смысле я хочу, чтобы значение замены было функцией значения соответствия. Это на С++, поэтому я выбрал Boost, но если другая распространенная библиотека регулярных выражений соответствует моим потребностям, лучше дайте мне знать.

Я нашел несколько решений .NET (C#, VB.NET), но не знаю, смогу ли я использовать здесь тот же подход (или, если смогу, то как это сделать).

Я знаю, что есть уродливое решение: иметь выражение формы "(%{0}%)|(%{1}%)...", а затем использовать шаблон замены, например "(1?" + val[0] + ")(2?" + val[1] ... + ")".

Но я хотел бы знать, можно ли сделать то, что я пытаюсь сделать, более элегантно.

Спасибо!


person rofrankel    schedule 09.11.2009    source источник
comment
Кто бы ни отредактировал это, чтобы правильно отформатировать мои встроенные выражения псевдокода - спасибо. :)   -  person rofrankel    schedule 09.11.2009


Ответы (1)


Я не верю, что у boost::regex есть простой способ сделать это. Самый простой способ, который я могу придумать, - это выполнить regex_search с использованием шаблона «(%{[0-9]+}%)», а затем выполнить итерацию по подсовпадениям в возвращенном объекте match_results. Вам нужно будет построить новую строку, объединив текст между каждым совпадением (метод match_results::position будет вашим другом здесь) с результатом преобразования подсовпадений в значения из вашего массива val.

person Brett Hall    schedule 09.11.2009
comment
Спасибо, у меня было ощущение, что это будет ответ, но я хотел перепроверить. Отмечу как ответ, если никто не возразит против. - person rofrankel; 10.11.2009
comment
Я не эксперт по boost::regex, я использовал его только для простых вещей, так что отнеситесь к моему ответу с недоверием. При этом я не смог найти в документах библиотеки ничего, что упростило бы то, что вы хотите сделать. Некоторые эксперты, если таковые имеются, могут возразить против. Возможно, вы захотите взглянуть на boost::spirit для того, что вы делаете, поскольку вы можете прикреплять семантические действия к частям совпадения с деревом синтаксического анализа - ваш поиск в массиве хорошо подходит как семантическое действие. Я считаю, что дух намного проще в использовании, чем регулярное выражение для чего-либо сложного. - person Brett Hall; 10.11.2009
comment
Спасибо, об этом приятно знать, но я думаю, что в данном случае это, вероятно, излишество по сравнению с использованием моего уродливого решения для построения строк. - person rofrankel; 10.11.2009