Разбор /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