首页 文章

C 11正则表达式IfThenElse - 单个,闭括号匹配或没有括号匹配

提问于
浏览
0

如何定义匹配字符串的c 11 / ECMAScript兼容正则表达式语句:

  • 包含一对封闭的圆括号,其中包含长度大于0的字母数字字符串 - 例如正则表达式 "\(\w+\)" ,它正确匹配 "(abc_123)" 并忽略不正确的 "(abc_123""abc_123)""abc_123" . 但是,上面的表达式不会忽略包含多个 balancer /不 balancer 包围的输入字符串 - 我想从匹配的结果中排除 "((abc_123)""(abc_123))""((abc_123))" .

  • 或单个字母数字单词,没有任何不 balancer 括号 - 例如正则表达式 "\w+" 正确匹配 "abc_123" ,但遗憾的是错误地与 "(abc_123""abc_123)""((abc_123)""(abc_123))""((abc_123))" 匹配...

为清楚起见,上述每个测试用例所需的匹配项是:

  • "abc_123" =匹配,

  • "(abc_123)" =匹配,

  • "(abc_123" =不匹配,

  • "abc_123)" =不匹配,

  • "((abc_123)" =不匹配,

  • "(abc_123))" =不匹配,

  • "((abc_123))" =不匹配 .

我一直在玩实现http://www.regular-expressions.info/conditional.html建议的IfThenElse格式,但还没有走得太远......有没有办法限制特定组的出现次数[例如 "(\(){0,1}" 匹配零或一个左手圆括号],并将前一组的重复次数传递给后一组[比如 "num\1" 等于 "(" 括号出现在 "(\(){0,1}" 中的次数,然后我可以将其传递给相应的右括号小组, "(\)){num\1}" 说...]

1 回答

  • 0

    我想,不是你想要的,而且非常优雅,但......

    使用"or"( | ),您应该获得基于 "\\(\\w+\\)|\\w+" 的优于零的解决方案 .

    完整的例子如下

    #include <regex>
    #include <iostream>
    
    bool isMatch (std::string const & str)
     {
       static std::regex const
          rgx { "\\(\\w+\\)|\\w+" };
    
       std::smatch srgx;
    
       return std::regex_match(str, srgx, rgx);
     }
    
    int main() 
     {
       std::cout << isMatch("abc_123")     << std::endl; // print 1
       std::cout << isMatch("(abc_123)")   << std::endl; // print 1
       std::cout << isMatch("(abc_123")    << std::endl; // print 0
       std::cout << isMatch("abc_123)")    << std::endl; // print 0
       std::cout << isMatch("((abc_123)")  << std::endl; // print 0
       std::cout << isMatch("(abc_123))")  << std::endl; // print 0
       std::cout << isMatch("((abc_123))") << std::endl; // print 0
     }
    

相关问题