Regex с BoostRegex C ++ - PullRequest
       34

Regex с BoostRegex C ++

0 голосов
/ 07 марта 2011

Привет, я хочу получить значения следующего выражения: ПОЛИГОН (100 20, 30 40, 20 10, 21 21) Поиск ПОЛИГОНА (100 20, 30 40, 20 10, 21 21)

Когда я выполняю следующий код, я получаю этот результат:
ПОЛИГОН (100 20, 30 40, 20 10, 21 21)
результат = 100 20
r2 = 100
r2 = 20
r2 =, 21 21
r2 = 21
размер = 7

Я не знаю, почему я не получаю средние значения ...

Спасибо за вашу помощь

#include <iostream>
#include <boost/regex.hpp>

using namespace std;

void testMatch(const boost::regex &ex, const string st) {
 cout << "Matching " << st << endl;
 if (boost::regex_match(st, ex)) {
  cout << " matches" << endl;
 }
 else {
  cout << " doesn’t match" << endl;
 }
}

void testSearch(const boost::regex &ex, const string st) {
 cout << "Searching " << st << endl;
 string::const_iterator start, end;
 start = st.begin();
 end = st.end();
 boost::match_results<std::string::const_iterator> what;
 boost::match_flag_type flags = boost::match_default;
 while(boost::regex_search(start, end, what, ex, flags))
 {
  cout << " " << what.str() << endl;
  cout << " result = " << what[1] << endl;
  cout << " r2 = " << what[2] << endl;
cout << " r2 = " << what[3] << endl;
cout << " r2 = " << what[4] << endl;
cout << " r2 = " << what[5] << endl;
cout << "size = " << what.size() << endl;
  start = what[0].second;
 }
}

int main(int argc, char *argv[])
{
 static const boost::regex ex("POLYGON\\(((\\-?\\d+) (\\-?\\d+))(\\, (\\-?\\d+) (\\-?\\d+))*\\)");
 testSearch(ex, "POLYGON(1 2)");
 testSearch(ex, "POLYGON(-1 2, 3 4)");
 testSearch(ex, "POLYGON(100 20, 30 40, 20 10, 21 21)");
 return 0;
}

Ответы [ 2 ]

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

Я не эксперт по регулярным выражениям, но я прочитал ваше регулярное выражение, и оно кажется правильным.

Этот пост на форуме , кажется, говорит о том же самом, где Boost.Regex возвращает только последний результат регулярного выражения.По-видимому, по умолчанию Boost отслеживает только последнее совпадение повторений совпадений.Тем не менее, есть экспериментальная функция, которая позволяет вам изменить это. Более подробная информация здесь , в разделе «Повторные захваты».

Однако есть 2 других «решения»:

  1. Используйте регулярное выражение для отслеживания первогопару чисел, затем удалите подстроку с этой парой и выполните еще одно регулярное выражение для этой подстроки, пока не получите все входные данные.

  2. Используйте Boost.Spirit это, вероятно, больше подходит для анализа ввода, чем Boost.Regex.

0 голосов
/ 07 марта 2011

Я получил результат от канала IRC.Регулярное выражение:

static const boost::regex ex("[\\d\\s]+");
static const boost::regex ex("[\\-\\d\\s]+");
...