Получение строки между 2 разделителями с использованием регулярных выражений C STl TR1

#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;
}
  

введите описание изображения здесь