首页 > 解决方案 > 正则表达式“\/[^\/]*”的“/someKey someValue /someOtherKey someOtherValue ...”的正则表达式匹配失败

问题描述

我正在尝试使用以下代码进行正则表达式匹配:

std::wstring a1 = L"/key1 val1 /key2 val2 /key3 val3";
std::wregex re(L"\/[^\/]*");
std::wsmatch ws;

if (std::regex_match(a1, ws, re))
{
    //do something
}

我期待看到以下一对匹配:

/key1 val1

/key2 val2

/key3 val3

但是,我没有看到任何匹配。知道为什么吗?

如果我尝试使用 L"/.+",那么至少我得到了整个字符串的匹配。

谢谢。

标签: c++regex

解决方案


你做错了几件事。

  1. 问题是它std::regex_match必须匹配整个字符串,但你试图只匹配它的一部分。

您需要使用std::regex_search或更改正则表达式以同时匹配所有三个部分:

  1. 您不需要在 c++ 中转义斜杠。

你的正则表达式应该是std::wregex re(L"/[^/]*");

最终代码

    std::wstring a1 = L"/key1 val1 /key2 val2 /key3 val3";
    std::wregex re(L"/[^/]*");
    std::wsmatch ws;
    
    while (std::regex_search(a1, ws, re)) {
      std::wcout << ws[0].str() << '\n';
      a1 = ws.suffix().str();
    }

编辑:感谢 Heap underrun 让正则表达式变得简单。


推荐阅读