为每个指定函数的出现返回引用的字符串arg

时间:2014-12-18 15:26:59

标签: c++ regex c++11 g++ c++-standard-library

我在C ++ 11x模式下使用Ubuntu Linux 14.04和g ++ 4.9.2并尝试使用 std :: regex(我也可以使用boost regex)。

需要解析此字符串(为清楚起见,删除引号上的转义符):

" (1+MyFun("foo" )-"3" ) > (MyFun ("x2_1:3")+MyFun( "10.0.0.30:80/b3.new" ) - MyFun2("z:2")/OldMyFun("blue")"

注意要求允许各种间距并避免MyFun的部分匹配(例如,不要与OldMyFun匹配("蓝色")。

我需要将未加引号 arg返回给字符串中的每一次MyFun, 不带 MyFun。对于上面的例子:

  • FOO
  • x2_1:3
  • 10.0.0.30:80/b3.new

但这些都没有:

  • 1
  • 3
  • Z:2
  • 蓝色

我有这个正则表达式,但它返回MyFun以及所需的(和引用的)args:

const std::string regexString="(MyFun\\()+(\"([^\"]*)\")\\)";

但只需要不带引号的arg。我正在使用std :: regex和std :: sregex_iterators。

#include <string>
#include <regex>
#include <iostream>
int main()
{
    const std::string str="(1+MyFun(\"foo\" )-\"3\" ) > (MyFun (\"x2_1:3\")"
        "+MyFun( \"10.0.0.30:80/b3.new\" ) - MyFun2(\"z:2\")/OldMyFun(\"blue\")";
    const std::string regexString="MyFun\\s*\\(\\s*\"([^\"]+)\"\\s*\\)";
    try
    {
        std::regex rgx(regexString);
        std::sregex_iterator i(str.begin(), str.end(), rgx);
        std::sregex_iterator e;
        while (i != e)
        {
            std::cout<<i->str()<<std::endl;
            ++i;
        }
    }
    catch(const std::exception& e)
    {
        std::cerr<<e.what()<<std::endl;
    }
}

1 个答案:

答案 0 :(得分:0)

MyFun\s*\(\s*"([^"]+)"\s*\)

MyFun\\s*\\(\\s*\"([^\"]+)\"\\s*\\)

试试这个。抓住捕获或组1.参见演示。

https://regex101.com/r/vN3sH3/8