C++ CAtlRegExp:匹配字符串直到设置为十六进制

C++ CAtlRegExp:匹配字符串直到设置为十六进制,c++,regex,mfc,C++,Regex,Mfc,我试图获取一个字符串并使用正则表达式来提取字符串内容以及字符串中的十六进制错误代码 例如: 未能装入应用程序编辑器[0xA0042251] 这将导致以下两组: 未能装入应用程序编辑器 和0xA0042251 我使用的是CAtlRegExp和可以 我尝试过查找堆栈溢出,并使用查找的概念找到了解决方案,但我不相信CAtlRegExp支持此功能 再次感谢。使用此正则表达式: ^.*?\s+\[0x[a-zA-F0-9]+\] 请注意,我在这个正则表达式中引入了验证,因为十六进制值只能包含从a到F的数

我试图获取一个字符串并使用正则表达式来提取字符串内容以及字符串中的十六进制错误代码

例如:

未能装入应用程序编辑器[0xA0042251]

这将导致以下两组:

未能装入应用程序编辑器 和0xA0042251

我使用的是CAtlRegExp和可以

我尝试过查找堆栈溢出,并使用查找的概念找到了解决方案,但我不相信CAtlRegExp支持此功能

再次感谢。

使用此正则表达式:

^.*?\s+\[0x[a-zA-F0-9]+\]

请注意,我在这个正则表达式中引入了验证,因为十六进制值只能包含从a到F的数字和字母


字符串1-未能装入应用程序HexEditor-将位于组1内,十六进制值0xA0042251将位于组2内。

您可以使用此正则表达式

(.*?)\[(\w+)\]

它使用了

的概念好吧,我从来没有使用过CAtlRegExp,但是。。。关于嵌套捕获的十指交叉

// catlregexp_class.cpp
#include <afx.h>
#include <atlrx.h>

int main(int argc, char* argv[])
{
    CAtlRegExp<> reUrl;
    // Two match groups: the whole string and the hex part.
    REParseError status = reUrl.Parse(
        "^({.*{0[xX]\\h+}.*})$" );

    if (REPARSE_ERROR_OK != status)
    {
        // Unexpected error.
        return 0;
    }

    CAtlREMatchContext<> mcUrl;
    if (!reUrl.Match(
"Failed to mount application \"HexEditor\" and 0xA0042251",
        &mcUrl))
    {
        // Unexpected error.
        return 0;
    }

    for (UINT nGroupIndex = 0; nGroupIndex < mcUrl.m_uNumGroups;
         ++nGroupIndex)
    {
        const CAtlREMatchContext<>::RECHAR* szStart = 0;
        const CAtlREMatchContext<>::RECHAR* szEnd = 0;
        mcUrl.GetMatch(nGroupIndex, &szStart, &szEnd);

        ptrdiff_t nLength = szEnd - szStart;
        printf_s("%d: \"%.*s\"\n", nGroupIndex, nLength, szStart);
    }

    return 0;
}
预期产量

0:无法装载应用程序HexEditor和0xA0042251
1:0xA0042251

您试图提取HexEditor和0xA0042251?@apgp88抱歉,应该已经澄清了。我试图获取整个字符串直到十六进制代码,因此未能装载应用程序HexEditor和0xA0042251,我读取了到CAtlRegExp的链接,看起来{}是捕获括号,不像其他类型的正则表达式。此外,与其他正则表达式不同,不会捕获整个匹配。匹配集合的0不是完全匹配,它是第一个捕获组。