Возвращать строку аргумента в кавычках для каждого вхождения указанной функции

Я использую Ubuntu Linux 14.04 и g++ 4.9.2 в режиме C++11x и пытаюсь использовать 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("синий").

Мне нужно возвращать аргумент без кавычек для каждого вхождения MyFun в строке без MyFun. Для приведенного выше примера:

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

Но ни один из них:

  • 1
  • 3
  • г:2
  • синий

У меня есть это регулярное выражение, но оно возвращает MyFun вместе с нужными (и в кавычках) аргументами:

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

Но нужен только не цитируемый аргумент. Я использую 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 ответ

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

или же

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

Попробуйте это. Захватите захват или группу 1. См. Демонстрацию.

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

Другие вопросы по тегам