2013-03-17 6 views
1

Я пытаюсь использовать boost regex в одном из моих проектов. На самом деле я переношу одно из своих программ на C++ и очень сильно зависит от регулярных выражений.Boost :: regex Странное поведение

Я вижу, что это противоречит моему предыдущему опыту с другими библиотеками Regex. Я надеюсь, что кто-то может помочь мне понять или сообщить мне, есть ли дополнительные флаги, которые я могу использовать для повышения моего требования.

Вот тема строка:

This is an example to test regex `54 6767 98` thats it 

Когда я использую это регулярное выражение: \\\d*, я ожидаю, чтобы получить 54 в качестве результата (что происходит, когда я использую .Net регулярное выражение или TperlRegex в Дельфах) Но когда я использование boost, функция возвращает TRUE, но cmatch пуст!

Нормально ли это? Я знаю, что могу использовать \d+. но это не так, как мне нужно, чтобы работать, потому что это будет причиной многих других проблем в более сложных регулярных выражениях, которые я использую в своем программном обеспечении.

Вот код, кстати:

cmatch what; 
boost::regex re("\\d*", regex::perl | regex::icase); 
std::string ssub = "something 54 67 979 some text"; 
if (boost::regex_search(ssub.c_str(), what , re) 
    return what[0]; 

Я думаю, что он должен вернуть 54 в этом случае, но это не так. Он работает в/Net Regex и TperlRegex, как я и ожидал.

С уважением

+0

'*' соответствует 0 или более. Вы хотите '?' для соответствия 1 или более. – stark

+0

@stark: НЕПРАВИЛЬНО. '?' соответствует 0 или 1. '+' соответствует 1 или более. Но здесь это не имеет никакого значения, так как двигатель должен быть жадным и есть самую длинную строку, которая может быть сопоставлена ​​'\ d *'. – nhahtdh

+0

Извините, это значит +. ANyway, \ d * совпадает в начале строки. – stark

ответ

3

'*' соответствует 0 или более. Вы хотите, чтобы «+» соответствовал 1 или более.

Проблема в том, что \ d * будет соответствовать любому месту в строке. Чтобы гарантировать, что он начинается с цифры, используйте +.

+1

+1. http://liveworkspace.org/code/3Kk24s$0. Вы также можете использовать флаг 'match_not_null' при вызове' regex_search'. http://liveworkspace.org/code/3Kk24s$1. – 2013-03-17 12:11:34

+0

Спасибо, но это был просто простой пример, чтобы показать, в чем моя проблема. У меня много сложных регулярных выражений, которые не будут работать из-за этой проблемы. использование + в этом примере не решает мою проблему. – QProgrammer

+0

llonesmiz, спасибо большое! Это был трюк! он работает, как я ожидал, когда я использую флаг match_not_null. – QProgrammer

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