Как получить базовую замену PREG_MATCH_ALL для STD :: String в C ++?

StackOverflow https://stackoverflow.com/questions/2177731

  •  24-09-2019
  •  | 
  •  

Вопрос

С "основным" подразумевается: только операторы "+" (-> следующие ..) и "|" (-> или) необходимы.

Прототип:

preg_match_all(std::string pattern, std::string subject, std::vector<std::string> &matches)

Пример использования:

std::vector<std::string> matches;
std::string pattern, subject;
subject = "Some text with a lots of foo foo and " +  char(255) + " again " + char(255);
pattern = "/" + char(255) + char(255) + "+|foo+/";
preg_match_all(pattern, subject, matches);

Матчи должны быть доступны после matches[n]. Отказ Кто-то получил намек без с использованием увеличение и / или pcre? Если нет, то, как я получил это реализовано с повышением?

Это было полезно?

Решение

Вы можете свернуть что-то, используя std :: string :: Найти, Делать матчи через функтором и толкая результаты на вектору строки.

То, как это реализуется в Boost, вероятно, является излишним для того, что вы хотите - вам сначала нужно было бы разложить выражение в лексих, а затем компилировать станок для анализа заданного Regexp.

Другие советы

Это вернет вектор всех совпадений, на котором они были найдены.

std::vector<std::pair<std::string, unsigned int>> RegexPP::MatchAll(std::string pattern, std::string haystack) {
    std::vector<std::pair<std::string, unsigned int>> matches;

    std::regex p(pattern);

    std::sregex_iterator start(haystack.begin(), haystack.end(), p), end;

    for(; start != end; start++) {
        auto match = *start; // dereference the iterator to get the match_result
        matches.push_back(std::pair<std::string, unsigned int>(match.str(), match.position()));
    }

    return matches;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top