У меня есть раздел в файле:
[Source]
[Source.Ia32][Source.Ia64]
Я создал выражение как:
const boost :: regex source_line_pattern («(Sources) (. *?)»);
Сейчас я пытаюсь сопоставить строку, но не могу сопоставить; это всегда возвращает 0.
if (boost::regex_match ( sToken, source_line_pattern ) )
return TRUE;
Обратите внимание, что значение sToken — [Источник]. [Source.Ia32] … и так далее.
Спасибо,
Есть как минимум две проблемы с вашим кодом. Во-первых,
заданное вами регулярное выражение содержит буквенную строку
"Sources"
, и не "Source"
что ты и есть
пытаясь соответствовать. Второе, что boost::regex_match
является
связанный: он должен соответствовать всей строке. То, что вы, кажется, хотите
является boost::regex_search
, В зависимости от того, что вы делаете,
однако, может быть лучше попытаться сопоставить всю строку:
"\\[Source(?:\\.(\\w+))?\\]\\s*"
, Который предусматривает захват
замыкающая часть, если есть (но не ведущая
"Source"
— нет смысла вообще захватывать то что есть
постоянная).
Обратите внимание, что последовательность ".*?"
очень сомнительно Обычно,
Я ожидаю, что парсер регулярных выражений потерпит неудачу, если
(не сбежавший) '*'
сопровождается '?'
,
Проблема в том, что boost::regex_match
возвращает true, только если вся входная строка соответствует регулярному выражению. Таким образом, ‘[‘ и ‘]’ не соответствуют вашему текущему регулярному выражению, и оно завершится неудачно.
Ваши варианты либо использовать boost::regex_search
, который будет искать подстроку ввода, которая соответствует вашему регулярному выражению, или изменяет регулярное выражение для принятия всей передаваемой строки.