Как получить строку с помощью boost::regex в С++?

пример строки:

std::string sentence = "Hello {Bobby}, hows {Johns}?."

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

строка может содержать {bobby|john|cindy} или {bobby||cindy} или {{bobby}}, где это будет {bobby}. Я пытаюсь выяснить регулярное выражение для этого.

Спасибо.


person unwise guy    schedule 03.07.2012    source источник


Ответы (3)


Общий подход и пример кода описан здесь.

Вам нужно регулярное выражение:

([^{}]*\{([^{}]*)\})+

Это регулярное выражение вообще не будет совпадать, если в строке не используются правильно спаренные невложенные фигурные скобки. Если он совпадает, вы можете использовать regex_iterator для обработки каждой второй подгруппы в каждом совпадении.

person Jirka Hanika    schedule 03.07.2012
comment
это регулярное выражение кажется недействительным... ошибка, которую я получил, не является допустимым регулярным выражением: недопустимое содержимое диапазона повторения. - person unwise guy; 04.07.2012
comment
@unwiseguy - я забыл убрать фигурные скобки, исправлено. Не нужно экранировать их в скобках. Скобки вне скобок обозначают повторяющиеся диапазоны, такие как a{3} = aaa - person Jirka Hanika; 04.07.2012

Основываясь на вашем комментарии к ответу Дэвида, вы можете оказаться на территории, которую регулярное выражение не может проанализировать напрямую. Вложенные вещи, которые вы описали с помощью двойных скобок, кажутся мне чем-то, что вам может понадобиться настоящая грамматика для анализа. В этом случае вы получите «радости» от изучения Bison. Если он не может разобрать его, вам нужно что-то намного более конкретное, чем простое.

Одинарная фигурная скобка, довольно простая. Что внутри двойника... это драконы. Потому что тогда вы начинаете рассуждать примерно так: «Что {тебе {хотите|здесь}}?» Грамматика, предоставленная Bison, может это решить. Я не уверен, что простое регулярное выражение может.

person Kevin Anderson    schedule 03.07.2012

Так ли прост ввод? Получать только подстроки внутри фигурных скобок? Если ваш ввод не будет охватывать все функции регулярного выражения, вы можете создать простой цикл для обхода жала, поддерживать состояние, если он находится внутри фигурной скобки, а затем обрабатывать эти байты строки так, как вы считаете нужным.

person David    schedule 03.07.2012
comment
Это довольно четкий вопрос. Ваш ответ никоим образом не помогает. - person dwo; 04.07.2012
comment
Нет, это становится более сложным, чем то, что я предоставил. Я просто хотел хорошее начало, строка может содержать {bobby|john|cindy} или {bobby||cindy} или {{bobby}}, где это будет {bobby}. Я пытаюсь выяснить регулярное выражение для этого. - person unwise guy; 04.07.2012