CRichEditCtrl - RegEx
Как использовать поиск RegEx в RichEditCtrl.
Проблема, которую я имею, состоит в том, чтобы выделить первый экземпляр текста, соответствующий списку регулярных выражений (регулярные выражения могут дублироваться, в этом случае первое регулярное выражение соответствует первому экземпляру, а второе - второму и т. Д.).
Поскольку FindText не поддерживает регулярные выражения, я пытаюсь получить весь текст, начиная с индекса 0, сопоставить первое регулярное выражение, найти совпадение, а затем выполнить FindText для сопоставленного текста, выделить сопоставленные индексы, повторить поиск с сопоставленного конца Индекс и следующее регулярное выражение.
int iSearchStart = 0;
for (auto ®exString : 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.