Regex не возвращает никаких результатов - PullRequest
0 голосов
/ 13 января 2012

У меня есть несколько вопросов по boost :: regex: я попробовал пример ниже.

1) Что такое 4-й параметр sregex_token_iterator?Это звучало как «совпадение по умолчанию», но зачем вам это, а не просто ничего не возвращать?Я пробовал без 4-го параметра, но он не компилируется.

2) Я получаю вывод: (1, 0) (0, 0) (3, 0) (0, 0) (5, 0)

Может кто-нибудь объяснить, что происходит не так?

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

// This example extracts X and Y from ( X , Y ), (X,Y), (X, Y), etc.


struct Point
{
   int X;
   int Y;
   Point(int x, int y): X(x), Y(y){}
};

typedef std::vector<Point> Polygon;

int main()
{
  Polygon poly;
  std::string s = "Polygon: (1.1,2.2), (3, 4), (5,6)";

  std::string floatRegEx = "[0-9]*\\.?[0-9]*"; // zero or more numerical characters as you want, then an optional '.', then zero or more numerical characters.
  // The \\. is for \. because the first \ is the c++ escpape character and the second \ is the regex escape character
  //const boost::regex r("(\\d+),(\\d+)");
  const boost::regex r("(\\s*" + floatRegEx + "\\s*,\\s*" + floatRegEx + "\\s*)");
  // \s is white space. We want this to allow (2,3) as well as (2, 3) or ( 2 , 3 ) etc.

  const boost::sregex_token_iterator end;
  std::vector<int> v; // This type has nothing to do with the type of objects you will be extracting
  v.push_back(1);
  v.push_back(2);

  for (boost::sregex_token_iterator i(s.begin(), s.end(), r, v); i != end;)
  {
    std::stringstream ssX;
    ssX << (*i).str();
    float x;
    ssX >> x;
    ++i;

    std::stringstream ssY;
    ssY << (*i).str();
    float y;
    ssY >> y;
    ++i;

    poly.push_back(Point(x, y));
  }

  for(size_t i = 0; i < poly.size(); ++i)
  {
    std::cout << "(" << poly[i].X << ", " << poly[i].Y << ")" << std::endl;
  }
  std::cout << std::endl;

  return 0;
}

1 Ответ

0 голосов
/ 13 января 2012

Ваше регулярное выражение необязательно:

"[0-9]*\\.?[0-9]*"

также соответствует пустой строке. Так что "(\\s*" + floatRegEx + "\\s*,\\s*" + floatRegEx + "\\s*)" также соответствует одной запятой.

Вы должны сделать хотя бы что-то обязательное:

"(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)"

Это позволяет 1, 1.1, 1. или .1, но не .:

(?:          # Either match...
 [0-9]+      # one or more digits, then
 (?:         # try to match...
  \.         #  a dot
  [0-9]*     #  and optional digits
 )?          # optionally.
|            # Or match...
 \.[0-9]+    # a dot and one or more digits.
)            # End of alternation
...