цикл по строке, чтобы увидеть, где строка не удалась - PullRequest
2 голосов
/ 12 марта 2012

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

т.е.

boost::regex const string_matcher("[0-9]{5}");
if (boost::regex_match(12A45,string_matcher))
{
    DCS_LOG_DEBUG("Correct\n");                     
}
else
{
    DCS_LOG_DEBUG("Incorrect\n");
}

Таким образом, результат будет

"A45"

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Вы бы использовали что-то вроде:

(^[0-9]{5}$)|^(?:[0-9]{0,5})(.*)$

Есть два захвата и группа без захвата (одна в (?:...))

Первый - для «правильных» данных. Строка состоит из 5 цифр. В противном случае пропускаются 0-5 цифр, и первый «неправильный» символ помещается во второй захват (.?). Обратите внимание, что этот захват будет успешным, даже если строка пуста.

Маленький образец:

std::regex const string_matcher("(^[0-9]{5}$)|^(?:[0-9]{0,5})(.*)$");
std::match_results<std::string::const_iterator> match;
std::string str("123456");

std::cout << "Success: " << std::boolalpha << std::regex_match(str, match, string_matcher) << std::endl;
std::cout << "Num of sub-matches: " << match.size() << std::endl;
std::cout << "Success capture: " << std::boolalpha << match[1].matched << " at " << match.position(1) << ": '" << match[1].str() << "'" << std::endl;
std::cout << "First failed character: " << std::boolalpha << match[2].matched << " at " << match.position(2) << ": '" << match[2].str() << "'" << std::endl;

(к сожалению, я не могу скомпилировать его на ideone, потому что он не поддерживает регулярные выражения, протестировано на VC ++)

Проверьте это с помощью:

(empty string)
1
AA
1AA
12345
123456
12345AA
1 голос
/ 12 марта 2012

Что вы можете сделать, это:

циклически перебирает символы вашей строки и во время зацикливания, когда результат неверен, выведите результат, используя indexof (chr), где chr - символ, находящийся сейчас в цикле, и затем выйдите из цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...