创建单个正则表达式而不是多个正则表达式

Create a single regular expression instead of multiple expression

本文关键字:正则表达式 单个 创建      更新时间:2023-10-16

我试图创建一个正则表达式,匹配推到字符串向量上的字符串。是否可以创建一个单一的正则表达式来匹配和提取所有的"数值"值?

std::vector<std::string> strings;
strings.push_back("100/2");
strings.push_back("2");
strings.push_back("200/99");
strings.push_back("150/9*0");
std::regex rex1("(\d{1,3})(\/(\d{1,2})(\*(\d+)))"); // matches 150/9*0
std::regex rex2("(\d{1,3})(\/(\d{1,2}))"); // matches 200/99
for (size_t k = 0; k < strings.size(); k++)
{
    std::smatch m;
    std::regex_match(strings[k], m, rex1);

    for (size_t i = 0; i < m.size(); i++)
        std::cout << "match " << i << ": " << m[i] << std::endl;
}
^(\d{1,3})(\/(\d{1,2})(\*(\d+))?)?$

使后半部分可选(这样"2"仍然匹配),并使后半部分中的*0位可选。

结尾的$是必要的,这样如果字符串确实包含可选部分,那么它们肯定仍然会匹配&被俘。