2016-11-18 6 views
0

Как использовать поиск RegEx в RichEditCtrl.CRichEditCtrl - RegEx


Проблема у меня есть, чтобы выделить первый экземпляр текста сопоставления списка регулярных выражений (регулярные выражения могут быть дубликатом, в этом случае, первое регулярное выражение соответствует первой инстанции и второй во второй, и скоро).

Поскольку FindText не поддерживает регулярное выражение, я пытаюсь получить весь текст, начиная с индекса 0, сопоставить первое регулярное выражение, найти совпадение, а затем выдать FindText по совпадающему тексту, выделить совпадающие индексы, повторить поиск от согласованного концевого индекса и следующего регулярного выражения.

int iSearchStart = 0; 
for (auto &regexString : regexStrings) { 
    CString text_cstr; 
    int txtLength = myRichEdit.GetTextLength(); 

    // I am getting an exception on second regex on the following statement 
    myRichEdit.GetTextRange(iSearchStart, txtLength-iSearchStart, text_cstr); 

    string text = text_cstr; 
    std::smatch match; 
    std::regex regexObj(regexString); 
    //look for the first match in the text 
    string matchedString; 
    if (std::regex_search(text, match, regexObj)) { 
     matchedString = match.str(); 

     FINDTEXTEX ft; 
     ft.chrg.cpMin = iSearchStart; 
     ft.chrg.cpMax = -1; 
     //ft.lpstrText = _T(tw.c_str()); 
     ft.lpstrText = _T(matchedString.c_str()); 
     int iFound = myRichEdit.FindText(FR_DOWN | FR_MATCHCASE | FR_WHOLEWORD, &ft); 
     if (iFound != -1) { 
      myRichEdit.SetSel(ft.chrgText); 
      CHARFORMAT2 cf; 
      ::memset(&cf, 0, sizeof(cf)); 
      cf.cbSize = sizeof(cf); 
      cf.dwMask = CFM_BACKCOLOR; 
      cf.crBackColor = RGB(255, 160, 160); // pale red 
      myRichEdit.SetSelectionCharFormat(cf); 
      iSearchStart = ft.chrgText.cpMax + 1; 
     } 
    } 
} 

ответ

0

Я нашел проблему, хотя второй параметр для GetTextRange - это длина текста, но на самом деле это индекс конца.

Так что, если я меняю

myRichEdit.GetTextRange(iSearchStart, txtLength-iSearchStart, text_cstr); 

в

myRichEdit.GetTextRange(iSearchStart, txtLength, text_cstr); 

это работает !!

Я сохраняю код для сообщества, чтобы увидеть один из способов использования регулярного выражения с помощью CRichEditCtrl.

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

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