Я пытаюсь найти буквенно-цифровые строки, используя следующее регулярное выражение:
^(?=.*\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}$
отлично работает при обнаружении буквенно-цифровых строк со специальными символами. Это просто отрицательная часть обзора, которая не работает.
Вы можете использовать негативный взгляд вперед, так же, как вы используете позитивный взгляд:
(?=.*\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_]
(осторожно, если вы скопируете-вставьте, там строка для чтения между (?! )
и [ ]
). Просто добавьте в финал [...]
любые специальные символы, которые вы хотите совместить.
^(?=.*\d)(?=.*[a-zA-Z]).{3,90}$
? Разве что-то вроде^[a-zA-Z0-9]{3,90}$
будет лучше?