CAtlRegExp:匹配字符串直到十六进制集

时间:2015-03-27 22:05:56

标签: c++ regex mfc

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

例如:

Failed to mount application "HexEditor" [0xA0042251]

这将导致两组如下:

Failed to mount application "HexEditor"     和0xA0042251

我正在使用CAtlRegExp和已建立的规则 found here

我已经尝试过查看堆栈溢出,并使用“环顾四周”的概念找到解决方案,但我不相信CAtlRegExp支持此功能。

再次感谢。

3 个答案:

答案 0 :(得分:0)

使用此正则表达式:

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

请注意我为此正则表达式引入了验证触摸,因为十六进制值只能包含AF的数字和字母。

您的字符串1 - Failed to mount application "HexEditor" - 将位于第1组内,十六进制值0xA0042251将位于第2组。

答案 1 :(得分:0)

您可以使用此正则表达式

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

Demo

它使用Group capture

的概念

答案 2 :(得分:0)

好吧,我从来没有使用过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”