我正在尝试使用boost::regex
匹配文件名,我有两种模式:
XYZsomestring
XYsomestringENDING
字符串somestring
可以是任何字符(> 0个字符)。
文件名的开头是XYZ
或XY
。
如果是XY
,则必须有字符串ENDING
来终止整个序列。
我试图将两个正则表达式与|
结合起来,但它不起作用。
这与第一个模式的文件名匹配:
(XYZ)(.*)
这与第二种模式的文件名匹配:
(XY)(.*)(ENDING)
但是当我将它们组合起来时,只有第一个模式匹配:
((XYZ)(.*))|((XY)(.*)(ENDING))
所有这些都应该是不区分大小写的,这就是我在构造函数中使用boost::regex::icase
的原因。
我没有icase
尝试过它,也没用。)
有什么建议吗?
答案 0 :(得分:1)
可能有更简单的表达式,但我认为正则表达式^xy(?(?!z).*ending$|.*$)
应该这样做:
#include <iostream>
#include <string>
#include <boost/regex.hpp>
bool bmatch(const std::string& x, const std::string& re_) {
const boost::regex re(re_, boost::regex::icase);
boost::smatch what;
return boost::regex_match(x, what, re);
}
int main()
{
std::string re = "^xy(?(?!z).*ending$|.*$)";
std::vector<std::string> vx = { "XYZ124f5sf", "xyz12345",
"XY38fsj dfENDING", "xy4 dfhd ending",
"XYZ", "XY345kENDI", "xy56NDING" };
for (auto i : vx) {
std::cout << "\nString '" << i;
if (bmatch(i, re)) {
std::cout <<
"' was matched." << std::endl;
} else {
std::cout <<
"' was not matched." << std::endl;
}
}
return 0;
}
这里是live demo。
修改强>
另外,我认为正则表达式^xy(z.*|.*ending)$
也可以正常工作。