tr1 :: regex regex_search问题

时间:2010-08-29 04:14:14

标签: regex search matching tr1

我正在使用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

我做错了什么?

2 个答案:

答案 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。