Мое последнее регулярное выражение не сработает, но я не могу понять причину, по которой - PullRequest
1 голос
/ 21 февраля 2012

У меня есть два вектора, один из которых содержит мои регулярные выражения, а другой содержит строку, в которой будут проверяться регулярные выражения, большинство из них работают нормально, за исключением этого (показанного ниже), строка является правильной строкой и соответствует регулярному выражению, но выводит неправильный вместо правильного.

INPUT STRING

.C/IATA

КОД НИЖЕ

std::string errorMessages [6][6] = {
    {
        "Correct Corparate Name\n",
    },
    {
        "Incorrect Format for Corporate Name\n",
    }
};

std::vector<std::string> el;
split(el,message,boost::is_any_of("\n"));
std::string a = ("");

for(int i = 0; i < el.size(); i++)
{
    if(el[i].substr(0,3) == ".C/")
    {
        DCS_LOG_DEBUG("--------------- Validating .C/ ---------------");
        output.push_back("\n--------------- Validating .C/ ---------------\n");
        str = el[i].substr(3);
        split(st,str,boost::is_any_of("/"));
        for (int split_id = 0 ; split_id < splitMask.size() ; split_id++ )
        {
            boost::regex const string_matcher_id(splitMask[split_id]);
            if(boost::regex_match(st[split_id],string_matcher_id))
            {
                a = errorMessages[0][split_id];
                DCS_LOG_DEBUG("" << a )
            }
            else
            {
                a = errorMessages[1][split_id];
                DCS_LOG_DEBUG("" << a)
            }
                output.push_back(a);
        }
    }
    else
    {
        DCS_LOG_DEBUG("Do Nothing");
    }

st [split_id] = "IATA"

splitMask [split_id] = "[a-zA-Z] {1,15}" <--- </strong>

Но он по-прежнему выводит Неправильный формат для корпоративного имени

Я не понимаю, почему он печатается неправильно, когда он должен быть правильным. Может кто-нибудь помочь мне здесь, пожалуйста?

1 Ответ

0 голосов
/ 19 марта 2012

Ваше регулярное выражение и окружающая логика в порядке.

Вам необходимо расширить регистрацию и распечатать соответствующую часть splitMask и st прямо перед вызовом boost::regex_match, чтобы дважды проверить, чтоценности - это то, во что вы верите.Напечатайте их, заключив их в пунктуацию, а также напечатайте длину строки, чтобы быть уверенными.

Как вы, вероятно, знаете, boost::regex_match находит совпадение, только если вся строка совпадает;следовательно, если где-то есть непечатаемый символ или, возможно, символ пробела, это прекрасно объяснит результат, который вы видели.

...