我正在使用tr1 :: regex尝试从字符串中提取一些匹配项。示例字符串可以是
asdf werq "one two three" asdf
我想要摆脱这个:
asdf
werq
one two three
asdf
将引号中的内容组合在一起,所以我正在尝试使用正则表达式\"(.+?)\"|([^\\s]+)
。我正在使用的代码是:
cmatch res;
regex reg("\"(.+?)\"|([^\\s]+)", regex_constants::icase);
regex_search("asdf werq \"one two three\" asdf", res, reg);
cout << res.size() << endl;
for (unsigned int i = 0; i < res.size(); ++k) {
cout << res[i] << endl;
}
但输出
3
asdf
asdf
我做错了什么?
答案 0 :(得分:0)
您可能希望尝试使用以下正则表达式:
(?<=")[^"]*(?=")|[^"\s]\S*
当被引用时,它当然需要被转义:
"(?<=\")[^\"]*(?=\")|[^\"\\s]\\S*"
顺便说一句,您使用的代码可能只匹配目标字符串中的第一个单词,因为它不使用match_any。您在结果中得到的3个项目可能是(1)整个匹配,(2)第一次捕获 - 为空,以及(3)第二次捕获,这是匹配的来源。
答案 1 :(得分:0)
您的正则表达式引擎似乎不支持lookbehind断言。为避免使用lookbehinds,您可以尝试以下操作:
"([^"]*)"|(\S+)
或引用:
"\"([^\"]*)\"|(\\S+)"
这个正则表达式将起作用,但每个匹配将有两个捕获,其中一个将为空(第一个 - 在非引用的单词的情况下,或第二个 - 在引用的字符串的情况下)。
为了能够使用它,您需要迭代所有匹配,并且对于每个匹配使用非空捕获。
我对TR1知之甚少,所以我不确切知道如何迭代所有匹配。但如果我没弄错的话,res.size()
总是等于3.
例如,对于字符串asdf "one two three" werq
,第一个匹配将是:
res[0] = "asdf" // the entire match
res[1] = "" // the first capture
res[2] = "asdf" // the second capture
第二场比赛将是:
res[0] = "\"one two three\"" // the entire match including leading/trailing quotes
res[1] = "one two three" // the first capture
res[2] = "" // the second capture
,第三场比赛将是:
res[0] = "werq" // the entire match
res[1] = "" // the first capture
res[2] = "werq" // the second capture
HTH。