Возвращать строку аргумента в кавычках для каждого вхождения указанной функции
Я использую 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. См. Демонстрацию.