gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:58:47 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com