对不包括引号内分隔符的字符串进行标记
首先我要说的是,我已经彻底了解了这个问题的所有其他解决方案,尽管它们非常相似,但没有一个能够完全解决我的问题。
我需要使用 boost 正则表达式提取除引号(对于带引号的)之外的所有标记。
我认为我需要使用的正则表达式是:
sregex pattern = sregex::compile("\"(?P<token>[^\"]*)\"|(?P<token>\\S+)");
但我收到错误:
命名标记已存在
针对 C# 发布的解决方案似乎适用于重复的命名标记,因为它是与另一个标记的 OR 表达式。
First let me say, I have gone thoroughly through all other solutions to this problem on SO, and although they are very similar, none fully solve my problem.
I need a to extract all tokens excluding quotes (for the quoted ones) using boost regex.
The regex I think I need to use is:
sregex pattern = sregex::compile("\"(?P<token>[^\"]*)\"|(?P<token>\\S+)");
But I get an error of:
named mark already exists
The solution posted for C# seems to work with a duplicate named mark given that it is an OR expression with the other one.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(3)
在查看此处的答案时,我测试了另一种方法,其中涉及使用不同的组标记名称,并在迭代它们时简单地测试哪个是空白的。虽然它可能不是最快的代码,但它是迄今为止最具可读性的解决方案,这对我的问题更重要。
这是对我有用的代码:
#include <boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;
...
std::vector<std::string> tokens;
std::string input = "here is a \"test string\"";
sregex pattern = sregex::compile("\"(?P<quoted>[^\"]*)\"|(?P<unquoted>\\S+)");
sregex_iterator cur( input.begin(), input.end(), pattern );
sregex_iterator end;
while(cur != end)
{
smatch const &what = *cur;
if(what["quoted"].length() > 0)
{
tokens.push_back(what["quoted"]);
}
else
{
tokens.push_back(what["unquoted"]);
}
cur++;
}
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我在这里回答了一个非常类似的问题:
如何使我的拆分仅在一个实行上工作并能够跳过字符串的带引号部分?
示例代码
使用相对广泛的编译器版本进行了测试增强版本。
https://gist.github.com/bcfbe2b5f071c7d153a0
I answered a very similar question here:
How to make my split work only on one real line and be capable to skip quoted parts of string?
The example code
Tested with a relatively wide range of compiler versions and Boost versions.
https://gist.github.com/bcfbe2b5f071c7d153a0