2016-12-12 10 views
3

У меня есть строка «CCCC», и я хочу совместить с ней «CCC» с перекрытием.Регулярное выражение C++ для совпадающих совпадений

Мой код:

... 
std::string input_seq = "CCCC"; 
std::regex re("CCC"); 
std::sregex_iterator next(input_seq.begin(), input_seq.end(), re); 
std::sregex_iterator end; 
while (next != end) { 
    std::smatch match = *next; 
    std::cout << match.str() << "\t" << "\t" << match.position() << "\t" << "\n"; 
    next++; 
} 
... 

Однако это только возвращает

CCC 0 

и пропускает CCC 1 решение, которое необходимо для меня.

Я читал о неживых '?' совпадение, но я не смог заставить его работать

ответ

5

Ваше регулярное выражение может быть помещено в скобки, которые можно обернуть положительным взглядом.

Чтобы заставить его работать на Mac тоже, убедитесь, что регулярное выражение соответствует (и, таким образом, потребляет) один символ в каждом матче, помещая . (или - также линии спички ломаются символы - [\s\S]) после того, как взгляд.

Затем вам нужно будет изменить код, чтобы получить первое значение захвата группы, как это:

#include <iostream> 
#include <regex> 
#include <string> 
using namespace std; 

int main() { 
    std::string input_seq = "CCCC"; 
    std::regex re("(?=(CCC))."); // <-- PATTERN MODIFICATION 
    std::sregex_iterator next(input_seq.begin(), input_seq.end(), re); 
    std::sregex_iterator end; 
    while (next != end) { 
     std::smatch match = *next; 
     std::cout << match.str(1) << "\t" << "\t" << match.position() << "\t" << "\n"; // <-- SEE HERE 
     next++; 
    } 
    return 0; 
} 

ВИДЕТЬ C++ demo

Выход:

CCC  0 
CCC  1 
+0

Спасибо, что решили его , Я отмечу это как можно скорее, как только смогу. –

+0

Это приводит к бесконечному циклу на яблочном clang. –

+0

@RichardHodges: Он должен быть связан с [этим] (http://stackoverflow.com/questions/33795759/c-mac-os-x-regex-causes-infinite-loop-with-regex-replace/33799633#33799633): реализация Mac не эффективно обрабатывает пустые совпадения. Добавленный '' 'после поиска может решить проблему: [' std :: regex re ("(? = (CCC))."); '] (Https://ideone.com/pEziQp). Если символы разрыва строки должны быть сопоставлены, '.' следует заменить на' [\ s \ S] '. –

 Смежные вопросы

  • Нет связанных вопросов^_^