忽略包含特殊单词的字符串(月份)

时间:2014-01-28 14:09:05

标签: c++ regex string

我正在尝试使用以下正则表达式查找字母数字字符串:

^(?=.*\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;
    }

问题:如何将此约束直接添加到正则表达式中,而不是使用此函数。

一种解决方案是使用How to ignore words in string using Regular Expressions中提到的否定前瞻。


我按如下方式使用它:

字符串:2-hello-001

正则表达式:^(?=.*\d)(?=.*[a-zA-Z]^(?!Jan|Feb|Mar)).{3,90}$

结果:无匹配

测试网站:http://regexlib.com/


@Robin和@RyanCarlson提供的编辑:^[][\w@_(){}ç\\ù%-]{3,90}$完美地用于检测具有特殊字符的字母数字字符串。这只是负面的前瞻部分无效。

1 个答案:

答案 0 :(得分: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}$

你的正则表达也很不清楚。如果你想要长度在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_]的快捷方式(如果您复制粘贴,请小心,这里有一个换行符,以便(?! )[ ]之间的可读性。只需在最终[...]中添加您想要匹配的特殊字符。