c++ - 忽略包含特殊词的字符串(月)

标签 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-你好-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}$

你的正则表达式也很不清楚。如果你想要长度在 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_](复制粘贴时要小心,为了便于阅读,(?!)[ ] 之间有一个换行符)。只需在最后添加 [...] 您想要匹配的任何特殊字符即可。

关于c++ - 忽略包含特殊词的字符串(月),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21407807/

相关文章:

c++ - QTcpServer错误C1083, "no such file or directory"

C++ 对象在没有创建的情况下被销毁?

java - 如何使字符串表现得像整数?

c - 如何在 C 中使用 strstr() 计算另一个文件中的关键字?

c++ - libgcc_s.so 冲突会导致 cpu 过载使用异常?

regex - 删除所有标点符号的等效正则表达式

java - 不包括空格的最小字符数

java - 这是正常的 Java 正则表达式行为吗?

javascript - 如何拆分和添加字符串中的各个值?

c++ - 成员函数指针的类型推导