Разбор /etc/passwd с помощью regex_*, нестандартное поведение C++

Предположим, у меня есть эта строка в моем файле etc/passwd:

xuser01:*:111000:201:User Name, School Info, Year:/homes/pc/xu/xuser01:/bin/ksh

Я просматриваю файл по строкам.

Из параметров я получаю имена пользователей / идентификаторы пользователей, которые говорят мне, какие строки я должен хранить в переменной.

Используя и regex_match, и regex_search, я не получил никаких результатов, хотя, когда я тестировал его на онлайн-тестерах регулярных выражений, он работал как ад. Есть идеи, почему это не работает?

regExpr = "^(xuser01|xuser02)+:((.*):?)+";
if(regex_search(line, regex(regExpr)))
{ 
cout << "Boom I got you!" << endl;
}

line содержит строку, прочитанную в данный момент, она перебирает весь файл и не находит строку. я использовал regex_match тоже результат тот же.

Различные регулярные выражения, которые я пробовал: (xuser01|xuser02)+ и аналогично, предназначенный для почти 100% уверенного соответствия (но все же, что мне нужно, чтобы соответствовать), ни один из них не работает в моей программе C++, на онлайн-тестировщиках регулярных выражений это делает.

Советы?

Заранее спасибо!

1 ответ

Решение

Похоже квантификатор + мешает С ++ получить ваши совпадения. Я думаю, что это избыточно в вашем регулярном выражении, так как у вас есть только уникальное количество "xuser" в вашей строке.

Этот код работает нормально, попадает в cout линия:

string line( "xuser01:*:111000:201:User Name, School Info, Year:/homes/pc/xu/xuser01:/bin/ksh" );
regex regExpr("^(xuser01|xuser02):((.*):?)");
if(regex_search(line, regExpr))
{ 
    cout << "Boom I got you!" << endl;
}

Тем не менее, вы не указали, что вы ищете. В настоящее время он будет соответствовать только 3 группам:

xuser01
*:111000:201:User Name, School Info, Year:/homes/pc/xu/xuser01:/bin/ksh
*:111000:201:User Name, School Info, Year:/homes/pc/xu/xuser01:/bin/ksh
Другие вопросы по тегам