【问题标题】:Named captured substring in pcre++在 pcre++ 中命名捕获的子字符串
【发布时间】:2010-06-17 00:24:45
【问题描述】:

我想用 pcre++ 库捕获命名子字符串。

我知道pcre库有这个功能,但是pcre++没有实现这个。

这是我现在拥有的(只是一个简单的例子):

pcrepp::Pcre regex("test (?P<groupName>bla)");

if (regex.search("test bla"))
{
    // Get matched group by name
    int pos = pcre_get_stringnumber(
        regex.get_pcre(),
        "groupName"
    );
    if (pos == PCRE_ERROR_NOSUBSTRING) return;

    // Get match
    std::string temp = regex[pos - 1];

    std::cout << "temp: " << temp << "\n";
}

如果我调试,pos 返回 1,没错,(?Pbla) 是第 1 个子匹配(0 是整个匹配)。应该没问题。但是... regex.matches() 返回 0。为什么是 :S ?

顺便说一句。我做 regex[pos - 1] 因为 pcre++ 重新索引结果,0 指向第一个子匹配,所以 1。所以 1 变成 0,2 变成 1,3 变成 2,等等。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 听起来 pcre++ 麻烦多于它的价值:不完整的库,大约 6 年没有发布,笨拙的运算符重载,子匹配索引的蹩脚重新定义......直接使用 pcre 或下载 Google 的 RE2 (@ 987654321@)

标签: c++ regex pcre


【解决方案1】:

不幸的是,我的错误是,我在真实程序中测试了正则表达式,但正则表达式有所不同。我用过这样的东西:

(?:/(?P<controller>[^/]+)(?:/(?P<action>[^/]+))?)?

所以组名到数字的转换很顺利,但是当我尝试访问组时,由于 (?: ... ) 我得到了范围索引?团体。我刚刚添加了一个检查,如果组索引 i 在正确的范围内,我可以使用该组。

抱歉在这里问得太早了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多