c++ - 正则表达式“\/[^\/]*”的“/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"/.+",那么至少我得到了整个字符串的匹配。
谢谢。
解决方案
你做错了几件事。
- 问题是它
std::regex_match
必须匹配整个字符串,但你试图只匹配它的一部分。
您需要使用std::regex_search
或更改正则表达式以同时匹配所有三个部分:
- 您不需要在 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 让正则表达式变得简单。
推荐阅读
- javascript - TripleDES 加密 - c# 和 javascript 的区别
- c# - 具有特殊字符的文件夹中的 c#.WebApi 解决方案的依赖性问题
- java - 如何在 libGDX 中以相反的方式射击子弹
- c# - 是否有一个选项可以在不制作“GlobalSuppressions.cs”文件的情况下停用样式警察规则?
- asp.net-core - 为什么在使用 IIS Express 而不是 Kestrel 时 Active Directory 可以与 Visual Studio MVC 模板一起使用?
- raspberry-pi3 - 当光标放在 wxTextCtrl 上时,调用屏幕键盘的最佳方法是什么?
- javascript - 有没有办法使用 UI Kitten 将主色设置为 Layout 组件的背景色?
- c# - 如何发送延续令牌来查询天蓝色的时间序列见解?
- java - 保存数组中两个数字之间的奇数
- xquery - 存在-db - 文件:移动不移动文档