Игнорировать строку, содержащую специальные слова (месяцы)

0

Я пытаюсь найти буквенно-цифровые строки, используя следующее регулярное выражение:

^(?=.*\d)(?=.*[a-zA-Z]).{3,90}$

Буквенно-цифровая строка: алфавитно-цифровая строка - любая строка, содержащая хотя бы число и букву плюс любые другие специальные символы, которые могут быть @- _ []() {} ç _\ù%


Я хочу добавить дополнительное ограничение, чтобы игнорировать все буквенно-цифровые строки, содержащие форматы следующего месяца:

JANVIER|FEVRIER|MARS|AVRIL|MAI|JUIN|JUILLET|AOUT|SEPTEMBRE|OCTOBRE|NOVEMBRE|DECEMBRE|Jan|Feb|Mar|Apr|May|Jun|JUN|Jul|Aug|Sep|Oct|Nov|Dec|[jJ]anvier|[fF][ée]vrier|[mM]ars|[aA]vril|[mM]ai|[jJ]uin|[jJ]uillet|[aA]o[éû]t|aout|[sS]eptembre|[oO]ctobre|[nN]ovembre|[dD][eé]cembre

Одно из решений - фактически соответствовать буквенно-цифровой строке. Затем проверьте, содержит ли эта строка одно из этих имен, используя следующую функцию:

 vector<string> findString(string s)
    {
        vector<string> vec;
        boost::regex rgx("JANVIER|FEVRIER|MARS|AVRIL|MAI|JUIN|JUILLET|AOUT|SEPTEMBRE|OCTOBRE|NOVEMBRE|DECEMBRE|Jan|Feb|Mar|Apr|May|Jun|JUN|Jul|Aug|Sep|Oct|Nov|Dec|[jJ]anvier|[fF][ée]vrier|[mM]ars|[aA]vril|[mM]ai|[jJ]uin|[jJ]uillet|[aA]o[éû]t|aout|[sS]eptembre|[oO]ctobre|[nN]ovembre|[dD][eé]cembre
");
        boost::smatch match;

        boost::sregex_iterator begin {s.begin(), s.end(), rgx},
              end {};

        for (boost::sregex_iterator& i = begin; i != end; ++i)
        {
            boost::smatch m = *i;
            vec.push_back(m.str());
        }

        return vec;
    }

Вопрос. Как я могу добавить это ограничение непосредственно в регулярное выражение вместо использования этой функции.

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


Я использовал его следующим образом:

Строка: 2-hello-001

Регулярное выражение: ^(?=.*\d)(?=.*[a-zA-Z]^(?!Jan|Feb|Mar)).{3,90}$

Результат: нет

Веб-сайт для тестирования: http://regexlib.com/


Редактирование, предоставленное @Robin и @RyanCarlson: ^[][\w@_(){}ç\\ù%-]{3,90}$ отлично работает при обнаружении буквенно-цифровых строк со специальными символами. Это просто отрицательная часть обзора, которая не работает.

  • 0
    Зачем вам нужно ^(?=.*\d)(?=.*[a-zA-Z]).{3,90}$ ? Разве что-то вроде ^[a-zA-Z0-9]{3,90}$ будет лучше?
  • 0
    Что ж, с вашим предложением @RyanCarlson, если я хочу, например, сопоставить следующую строку: 555_tdstg - Хани, я не могу этого сделать.
Показать ещё 7 комментариев
Теги:
string

1 ответ

2
Лучший ответ

Вы можете использовать негативный взгляд вперед, так же, как вы используете позитивный взгляд:

(?=.*\d)(?=.*[a-zA-Z])
(?!.*(?:JANVIER|FEVRIER|MARS|AVRIL|MAI|JUIN|JUILLET|AOUT|SEPTEMBRE|OCTOBRE|NOVEMBRE|DECEMBRE|Jan|Feb|Mar|Apr|May|Jun|JUN|Jul|Aug|Sep|Oct|Nov|Dec|[jJ]anvier|[fF][ée]vrier|[mM]ars|[aA]vril|[mM]ai|[jJ]uin|[jJ]uillet|[aA]o[éû]t|aout|[sS]eptembre|[oO]ctobre|[nN]ovembre|[dD][eé]cembre)).{3,90}$

Также вы regex довольно неясно. Если вам нужны буквенно-цифровые строки длиной от 3 до 90, вы можете просто сделать:

/^(?!.*(?:JANVIER|F[Eé]VRIER|MARS|AVRIL|MAI|JUIN|JUILLET|AO[Uù]T|SEPTEMBRE|OCTOBRE|NOVEMBRE|D[Eé]CEMBRE|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))
[][\w@_(){}ç\\ù%-]{3,90}$/i

флаг i означает, что он будет соответствовать верхнему и нижнему регистру (так что вы можете уменьшить свой запрещенный список), \w является ярлыком для [0-9a-zA-Z_] (осторожно, если вы скопируете-вставьте, там строка для чтения между (?! ) и [ ]). Просто добавьте в финал [...] любые специальные символы, которые вы хотите совместить.

  • 0
    Я попробовал это на regexlib.com, но у меня не получилось
  • 0
    Да, я использовал отрицательный взгляд @Robin
Показать ещё 14 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню