2013-06-17 2 views
0

У меня есть раздел в файле:Как определить регулярное выражение в boost?

[Source] 

[Source.Ia32] 


[Source.Ia64] 

Я создал выражение как:

Const повышение :: регулярных выражений source_line_pattern; ("(Sources) (*).?")

Теперь, я пытаюсь соответствовать строке, но я не могу соответствовать; он всегда возвращается 0.

if (boost::regex_match (sToken, source_line_pattern)) 
    return TRUE; 

Обратите внимание, что значение sToken является [Source]. [Source.Ia32] ... и так далее.

Спасибо,

ответ

1

Вопрос заключается в том, что boost::regex_match только возвращает истину, если вся строка ввода сочетается с регулярным выражением. Таким образом, '[' и ']' не соответствуют вашему текущему регулярному выражению, и он потерпит неудачу.

Ваши варианты либо использовать boost::regex_search, который будет искать подстроки входа, который соответствует вашему регулярному выражению, или изменить ваше регулярное выражение, чтобы принять всю строку передается в.

2

Есть по крайней мере две проблемы ваш код. Во-первых, регулярное выражение , которое вы указываете, содержит литеральную строку "Sources", а не "Source", вот что вам кажется пытается совместить. Во-вторых, boost::regex_match: bound: он должен соответствовать всей строке. Что вам нужно, - boost::regex_search. В зависимости от того, что вы делаете, , однако, может быть, лучше попытаться сопоставить всю строку: "\\[Source(?:\\.(\\w+))?\\]\\s*". Который обеспечивает захват задней части, если присутствует (но не ведущий "Source" --- нет смысла, в общем, захватывать что-то a константа).

Обратите внимание, что последовательность ".*?" очень сомнительна. Обычно Я ожидал бы, что анализатор регулярных выражений будет терпеть неудачу, если a (неэкранированный) '*' следует за '?'.

+2

'. *?' Означает не-жадный повтор в синтаксисе regex Perl, который по умолчанию используется в 'boost :: regex': http://www.boost.org/doc/libs/1_34_0/libs/regex/ doc/syntax_perl.html – svk

+0

Я добавил регулярное выражение «\\ [Source (?: \. (\\ w +))? \\] \\ s *", но он все равно возвращается 0. – user1553605

+0

@svk Ah. Я не искал его и просто интерпретировал его как '*', за которым следует '?', А не как один токен '*?'. –