Вам не нужно регулярное выражение, вы можете легко написать собственный синтаксический анализатор.
Следующий код анализирует одну строку и сохраняет значение в предоставленном unordered_map
:
void parseLine(char * line, std::unordered_map<std::string, std::string> & values)
{
// Find entry name
const char * name = line;
for (char c = *line; c != '='; c = *(++line));
*line = '\0';
// Find entry value
const char * val = line + 1;
for (char c = *line; c != ';'; c = *(++line));
*line = '\0';
// Insert value in map
values.insert(std::pair<std::string, std::string>(name, val));
}
Он просто сканирует линию, пока не будут найдены '='
и ';'
.Обратите внимание, что это работает, только если синтаксис правильный (без пробелов, точка с запятой в конце), но я думаю, что это то, что вы хотите.
Затем для анализа файла:
std::unordered_map<std::string, std::string> values;
FILE * fp = fopen("somefile", "r");
if (fp)
{
char line[128]; // replace with max line length
while (fgets(line, 128, fp))
parseLine(line, values);
}
fclose(fp);
fgets(line, 128, fp)
читает до 128
символов текущей строки файла fp
и сохраняет его в буфере line
.Когда он достигает EOF, он возвращает nullptr
и цикл заканчивается.
Конечно, вы можете обернуть это в выбранном вами классе.