0

RichEditCtrl で正規表現検索を使用する方法。


私が抱えている問題は、正規表現のリストに一致するテキストの最初のインスタンスを強調表示することです (正規表現は重複する可能性があります。その場合、最初の正規表現は最初のインスタンスに一致し、2 番目の正規表現は 2 番目のインスタンスに一致するなど)。

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;
        }
    }
}
4

1 に答える 1