#c #regex #stl
#c #регулярное выражение #stl
Вопрос:
Я хочу извлечь строку между открытыми и закрывающими скобками.Итак, если содержимое
145(5)(7)
вывод должен быть
5
7
Я пробовал с C STL TR1, используя приведенный ниже код
const std::tr1::regex pattern("\((.*?)\)");
// the source text
std::string text= "145(5)(7)";
const std::tr1::sregex_token_iterator end;
for (std::tr1::sregex_token_iterator i(text.begin(),
text.end(), pattern);
i != end;
i)
{
std::cout << *i << std::endl;
}
Я получаю вывод в виде,
(5)
(7)
Я хочу вывод без разделителей.
Пожалуйста, помогите мне выполнить мое требование, используя STL TR1.
Комментарии:
1. Учитывая, что TR1 граничит с ancient, какой компилятор и стандартную библиотеку вы используете? Какие из них версии?
2. Я использую VS2008.
3. Это очень старый компилятор, и он не поддерживает большую часть предстоящего стандарта C 11. Таким образом, даже если у вас есть некоторые функциональные возможности из TR1, вы не можете быть уверены, что все это будет работать идеально. Вам действительно следует попробовать обновиться до более поздней версии VS.
4. Вам не нужно
regex
для этого. вы можете использоватьgetline
иstringstream
, и это совместимо со всеми компиляторами.5. Попробуйте
const std::tr1::sregex_iterator end; for (std::tr1::sregex_iterator i(text.begin(), text.end(), pattern); i != end; i) { std::cout << (*i).str(1) << std::endl; }
Ответ №1:
Вам нужно использовать sregex_iterator
вместо sregex_token_iterator
, а затем получить доступ к вложенным наборам через .str(n)
:
const std::tr1::regex pattern1("\((.*?)\)");
std::string text= "145(5)(7)";
const std::tr1::sregex_iterator end;
for (std::tr1::sregex_iterator i(text.begin(),
text.end(), pattern1);
i != end;
i)
{
std::cout << (*i).str(1) << std::endl;
}