CRichEditCtrl - RegEx

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


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

Поскольку 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;
        }
    }
}

1 ответ

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

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

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

в

myRichEdit.GetTextRange(iSearchStart, txtLength, text_cstr);  

оно работает!!

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

Другие вопросы по тегам