2013-08-06 4 views
3

Почему эта часть кода кода C++ навсегда?Зачем заменять регулярное выражение?

string word = " a\n"; 
regex indent("^(|\t)*"); 
word = regex_replace(word, indent, ""); 

и почему этот фрагмент кода C++ заканчивается быстро?

string word = " a\n"; 
regex indent("^(|\t)+"); 
word = regex_replace(word, indent, ""); 

и добавить еще один поворот, почему это быстро заканчивается?

string word = " a\n"; 
regex indent("^(|\t)+?"); 
word = regex_replace(word, indent, ""); 

Я бы ожидать, что "^(|\t)+?" будет такой же, как "^(|\t)*"

Я использую LibC++ и LLVM и стандартный C++ библиотека регулярных выражений.

+0

Я слышал, что libstdC++ '' не является полным. [См. Этот ответ на соответствующий вопрос.] (Http://stackoverflow.com/a/12665408/445976) – Blastfurnace

+0

use boost regex lib – flyingfoxlee

ответ

0

Код в порядке. Библиотека regex в основном не реализована в вашей версии libC++. Лучше всего использовать другую библиотеку, например boost или обновленную версию libC++.

+0

На самом деле он работает в новейшей версии libC++ –

3

Мое предположение, что ^(|\t)* ничего не соответствует (т. Е. * Означает 0 или более, чтобы оно соответствовало одному пространству, одной вкладке или пустой строке), а существующий (плохой) алгоритм обнаружил много ничего в строке ввода ... навсегда. Другими словами, вы попали в ошибку в реализации регулярного выражения.

0

Я загрузил и скомпилировал версию libC++ с выпуклой границей, а версия "^(|\t)*" больше не блокирует. Поэтому я собираюсь записать это до старой библиотеки.

Смежные вопросы