如何使用C++11正则表达式进行通配符字符串匹配

3

这是一个静态字符串列表,它只在字符串的开头或结尾使用通配符,没有其他正则表达式规则。 AAAA,BBBB*,*CCCC,*DDDD*。 我需要找到给定的字符串与此列表中的任何字符串匹配。我正在寻找像这样的东西。

bool isMatch(std::string str)
{
  std::vector<string> my_list = {AAAA, BBBB*, *CCCC, *DDDD*};
  if(str.matchAny(my_list))
    return true;

  return false;
}

我不喜欢使用任何第三方库,比如boost。是否可以通过C++11的std::regex来实现?或者还有其他简单的方法吗?


当然可以使用C++11正则表达式库完成。不过,需要编写更多的代码,并确保代码是有效的。 - Some programmer dude
在给定字符串列表 AAAA, BBBB*, *CCCC, *DDDD* 中,您希望返回什么? - Ro Yo Mi
正则表达式看起来像这样:R"(\*?\w+\*?)" 演示 - Jarod42
2个回答

1

在这里使用正则表达式会过于复杂。只需在适当的位置查找每个字符序列:

str == "AAAA"

str.find("BBBB") == 0

str.find("CCCC") == str.size() - 4

str.find("DDDD") != std::string::npos

谢谢!但是,当字符串模式列表变得更长时,会有很多检查对吧?我正在寻找一种通用的方法来处理这个问题,因为未来可能会有人向模式列表中添加更多的字符串。 - Nayana Adassuriya
我给你的代码是一种通用的方式。你描述了你感兴趣的四种模式,我为每种模式都提供了代码。 - Pete Becker
这是在谷歌上使用正则表达式匹配通配符字符串的第一个结果,虽然OP引用的示例很简单,但在许多情况下,例如过滤列表、使用通配符匹配路径等,这非常必要。 - Ani
这是在谷歌上使用正则表达式匹配通配符字符串的第一个结果。虽然是的,OP引用的例子很简单,但在许多情况下,像过滤列表、使用通配符匹配路径等,这是非常必要的。 - undefined

0

这是我通常的做法,我用".*"替换"\\*",用"."替换"\\?"

以下是C++代码。

#include <iostream>
#include <regex>

using namespace std;

int main()
{
    regex star_replace("\\*");
    regex questionmark_replace("\\?");
    
    string data = "AAAABBBCCDDDD";
    string pattern = "*CC*";
    
    auto wildcard_pattern = regex_replace(
            regex_replace(pattern, star_replace, ".*"),
                questionmark_replace, ".");
    
    cout << "Wildcard: " << pattern << " Regex: " << wildcard_pattern << endl;
    
    regex wildcard_regex("^" + wildcard_pattern + "$");
    
    if (regex_match(data, wildcard_regex))
        cout << "Match!" << endl;
    else
        cout << "No match!" << endl;

    return 0;
}

这里有一个指向onlinegdb上可运行代码的链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接