Регенировать токены с Boost, получая только последние буквы слов - PullRequest
0 голосов
/ 09 марта 2011

Я пытаюсь разобрать простую структуру предложений с помощью Boost.Это мой первый раз, когда я использую Boost, поэтому я могу сделать это совершенно неправильно.Я хочу принимать только строки в этом формате:

  • Должен начинаться с буквы (без учета регистра)
  • Может содержать:
    • Буквенные символы
    • Числовые символы
    • Подчеркивание
    • Дефисы
  • Все остальные символы служат разделителями

Поскольку я надеваюНе знаю, какие символы являются моими разделителями (их может быть множество), я пытался сделать регулярное выражение, чувствительное к этому.Единственная проблема в том, что я получаю только последнюю букву каждого слова.Это заставляет меня верить, что мое регулярное выражение верно, но я не использую повышение.Вот мой код:

boost::regex regexp("[A-Za-z]([A-Za-z]|[0-9]|_|-)*", boost::regex::normal | boost::regbase::icase);
boost::sregex_token_iterator i(text.begin(), text.end(), regexp, 1);
boost::sregex_token_iterator j;
while(i != j){
    cout << *i++ << std::endl;
}

Я смоделировал это после того, что нашел на веб-сайте Boost .Я использовал последний пример (внизу страницы) в качестве шаблона для построения mf-кода.В данном случае текст является объектом типа string.

Правильно ли мое регулярное выражение?Я правильно использую Boost?

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Измените свое регулярное выражение на: ([A-Za-z][-A-Za-z0-9_]*)

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

1 голос
/ 09 марта 2011

Вы запрашиваете первое совпадение для каждого совпадения RE.Это относится к этому подвыражению: ([A-Za-z]|[0-9]|_|-), и вы получаете последнее совпадение (обратите внимание, что оно квалифицировано *) для каждого совпадения.Отсюда и последний персонаж.Я думаю, что вы должны передать 0 для числа подстать или просто пропустить этот параметр.Когда я изменяю ваш код для этого, он делает то, что, как я думаю, вы хотите, чтобы он делал.

...