std regex_search для соответствия только текущей строке
Я использую различные регулярные выражения для анализа исходного файла C, строка за строкой. Сначала я читаю все содержимое файла в строке:
ifstream file_stream("commented.cpp",ifstream::binary);
std::string txt((std::istreambuf_iterator<char>(file_stream)),
std::istreambuf_iterator<char>());
Затем я использую набор регулярных выражений, которые следует применять непрерывно до тех пор, пока не будет найдено совпадение, здесь я приведу только одно, например:
vector<regex> rules = { regex("^//[^\n]*$") };
char * search =(char*)txt.c_str();
int position = 0, length = 0;
for (int i = 0; i < rules.size(); i++) {
cmatch match;
if (regex_search(search + position, match, rules[i],regex_constants::match_not_bol | regex_constants::match_not_eol))
{
position += ( match.position() + match.length() );
}
}
Но это не работает. Он будет соответствовать комментарию не в текущей строке, но будет искать всю строку, для первого соответствия,regex_constants::match_not_bol
а такжеregex_constants::match_not_eol
должен сделатьregex_search
распознавать^$
только как начало / конец строки, а не конец / конец всего блока. Итак, вот мой файл:
Commented.cpp:
#include <stdio.h>
//comment
Код должен потерпеть неудачу, моя логика с этими опциями regex_search, совпадение должно завершиться неудачей, потому что он должен искать шаблон в первой строке:
#include <stdio.h>
Но вместо этого он ищет всю строку и всегда находит//comment
. Мне нужна помощь, чтобы сделатьregex_search
совпадать только в текущей строке. Вариантыmatch_not_bol
а такжеmatch_not_eol
не помогай мне. Конечно, я могу читать файл построчно в векторе, а затем выполнять сопоставление всех правил для каждой строки в векторе, но это очень медленно, я сделал это, и слишком много времени занимает разбор большого файла, такого как именно поэтому я хочу позволить регулярному выражению иметь дело с новыми строками и использовать счетчик позиционирования.