как определить регулярное выражение в boost?

У меня есть раздел в файле:

[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] … и так далее.

Спасибо,

0

Решение

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

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

2

Другие решения

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

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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector