2010-02-01 1 views
1

с "основным": Только операторы "+" (-> follow ..) и "|" (-> или).Как получить базовую замену preg_match_all для std :: string в C++?

Прототип

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); 

Спички должны быть доступны с помощью afterwardsa matches[n]. Кто-то получил подсказку без с использованием boost и/или PCRE? Если нет, то как я понял это с повышением?

ответ

0

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

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

+0

благодарим за ответ! возможно, это умнее, потому что я могу контролировать, как создается шаблон, - чтобы поместить шаблон в вектор. Постараюсь что-то вроде этого: недействительным match_all (Std :: вектор шаблон, станд :: строковый объект, станд :: вектор и спички) { неподписанных долгое INT patKey = (pattern.size() - 1); для (без знака long int i = 0; i Georg

+0

@Georg - неплохо было бы добавить функтор для определения соответствие. –

0

Посмотрите в библиотеку Boost.regex, http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html

+1

Woah это ответ на вопрос: «Кто-то получил подсказку, не используя boost и/или PCRE? Если нет, то как я понял это с повышением?»? –

+0

Каждый проект должен включать Boost, если нет веских оснований для этого, поэтому нет оснований не использовать Boost там, где это возможно; Я твердо верю, что любой программист на C++, который предпочитает изобретать что-то, что Boost уже делает, без уважительной причины, должен быть немедленно уволен, поэтому никто не должен разбираться с их кодом. Пример респондента предположил, что они хотят иметь возможность пройти образец, поэтому я считаю, что Boost.Regex - лучший выбор. –

+0

@dauphic, что вы написали, однако, было «Q: что я могу использовать для имитации Boost.Regex? A: Boost.Regex» - я бы не счел это полезным ответом. –

2

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

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; 
} 
Смежные вопросы