Помогите с C ++ Boost :: regex - PullRequest
       12

Помогите с C ++ Boost :: regex

2 голосов
/ 07 апреля 2010

Я пытаюсь получить все слова внутри строки, используя Boost :: regex в C ++.

Вот мой ввод:

"Привет! Сеть - бла-бла-хо-хо"

используя этот код:

      regex rgx("[a-z]+",boost::regex::perl|boost::regex::icase);

      regex_search(input, result, rgx);

       for(unsigned int j=0; j<result.size(); ++j)
       {
         cout << result[j] << endl;
       }

Я получаю только первое слово "Hello" .. что не так с моим кодом?result.size () возвращает 1.

спасибо.

Ответы [ 6 ]

5 голосов
/ 07 апреля 2010

regex_search находит только первое совпадение. Чтобы перебрать все совпадения, используйте regex_iterator

1 голос
/ 20 мая 2011

Попробуйте rgx("(?:(\\w+)\\W+)+"); в качестве регулярного выражения. (?: запустит немаркированную группу, которая заканчивается совпадением )+, которое будет соответствовать словам в строке 1 или более раз (\\w+) будет соответствовать альфе, цифрам и подчеркиванию 1 или более раз как отмеченная группа, то есть типичные слова, подобные символам, которые возвращаются вам в результате [i] \\W+ будет соответствовать одному или нескольким смежным несловесным символам, то есть пробелу, |, - и т. Д.

0 голосов
/ 07 апреля 2010

Чтобы соответствовать словам, попробуйте это регулярное выражение:

regex rgx("\\<[a-z]+\\>",boost::regex::perl|boost::regex::icase);

Согласно документам, \< обозначает начало слова, а \> обозначает конец слова в разновидности Perl соответствия Boost с регулярным выражением.

Боюсь, кто-то еще должен объяснить, как повторять совпадения. Ускоренная документация заставляет мой мозг болеть.

0 голосов
/ 07 апреля 2010

Возможно, вы могли бы попытаться использовать повторный захват со следующим регулярным выражением "(?:([a-z]+)\\b\\s*)+".

0 голосов
/ 07 апреля 2010

Вам нужно будет захватить любой набор [a-z]+ (или некоторый другой регулярное выражение для сопоставления слов), ограниченный пробелами или границами строк. Вы можете попробовать что-то вроде этого:

^(\s*.+\s*)+$

В любом случае, это не проблема boost :: regex, это просто проблема regex. используйте perl или оболочку bash (или любое количество веб-инструментов), чтобы выяснить свое регулярное выражение, а затем используйте в своем коде.

0 голосов
/ 07 апреля 2010

Вы ищете только буквенные символы, а не пробелы, пробелы или дефисы. regex_search() вероятно, просто возвращает первое совпадение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...