如何在RichEditCtrl中使用RegEx搜索。
我遇到的问题是突出显示匹配正则表达式列表的文本的第一个实例(正则表达式可以重复,在这种情况下,第一个正则表达式匹配第一个实例,第二个匹配第二个实例,依此类推)。
由于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;
}
}
}
答案 0 :(得分:0)
我发现了问题,虽然GetTextRange的第二个参数是文本的长度,但它实际上是结尾的索引。
所以,如果我改变
myRichEdit.GetTextRange(iSearchStart, txtLength-iSearchStart, text_cstr);
到
myRichEdit.GetTextRange(iSearchStart, txtLength, text_cstr);
它有效!!
我正在为社区保留代码以查看使用CRichEditCtrl的正则表达式的一种方法。