gpt4 book ai didi

c++ - 正则表达式匹配两个文件名模式之一

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:47 24 4
gpt4 key购买 nike

我正在尝试使用 boost::regex 来匹配文件名,我有两种模式:

  1. XYZsomestring
  2. XYsomestringENDING

字符串 somestring 可以是任何东西(>0 个字符)。文件名的开头是 XYZXY。如果是 XY ,则必须有字符串 ENDING 终止整个序列。我尝试将两个正则表达式与 | 结合使用,但它不起作用。这将文件名与第一个模式匹配:

(XYZ)(.*)

这会将文件名与第二种模式相匹配:

(XY)(.*)(ENDING)

但是当我组合它们时,只有第一个模式匹配:

((XYZ)(.*))|((XY)(.*)(ENDING))

所有这些都应该不区分大小写,这就是为什么我在构造函数中使用 boost::regex::icase 的原因。我在没有那个 icase 的情况下尝试过,但也不起作用)。

有什么建议吗?

最佳答案

可能有更简单的表达式,但我认为正则表达式 ^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)$ 也应该有效。

关于c++ - 正则表达式匹配两个文件名模式之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30939981/

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