【发布时间】:2014-01-28 14:09:05
【问题描述】:
我正在尝试使用以下正则表达式查找字母数字字符串:
^(?=.*\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}$ 在检测带有特殊字符的字母数字字符串方面非常有效。只是消极的前瞻部分不起作用。
【问题讨论】:
-
为什么需要
^(?=.*\d)(?=.*[a-zA-Z]).{3,90}$?像^[a-zA-Z0-9]{3,90}$这样的东西不是更好吗? -
好吧,如果我想匹配以下字符串,请根据@RyanCarlson 的建议:555_tdstg--hani 我做不到。
-
它也会匹配像
a1"&@^&@?<.?\]\[~@^@^`这样的字符串 -
请定义(通过更新您的问题,以便每个人都清楚)您要匹配哪些特殊字符。
-
你也想要空格吗?还有
/?您应该对这些字符使用代码标记,我编辑了您的问题以尝试澄清这一点。