C++ 11正则表达式IfThenElse - 单一,封闭的括号匹配或不匹配的括号

问题描述:

我如何定义一个C++相匹配的字符串或者11/ECMAScript的正则表达式兼容声明:C++ 11正则表达式IfThenElse - 单一,封闭的括号匹配或不匹配的括号

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

  2. 或单个,字母词,没有任何不平衡的括号 - 例如像正则表达式语句"\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}"说...]

+0

你确定这可以通过常规的语言来表示? – MrEricSir

+0

您是否愿意接受使用Boost.Regex而不是C++ 11正则表达式的解决方案?我认为如果你使用否定的后置断言可以做到这一点,但这些不被C++支持。11正则表达式 – harmic

+0

它只需要大约四行代码直接检查这个匹配。为什么使用正则表达式使其复杂化? –

不是你想怎么样,我想,和非真正优雅,但...

用“或”(|),你应该获得更好胜于无解决方案基于"\\(\\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 
} 
+0

我有一个印象,OP希望找到输入中包含的匹配子字符串(例如,regex_search而不是regex_match)。否则,像你所做的那样解决这个问题是微不足道的。 – harmic

+0

@harmic - 我不清楚OP想要什么;你的印象可能是正确的,但是......在这种情况下,为什么“(abc_123”应该失败呢?希望OP能够澄清,而且是的:我的解决方案确实很简单,但它的真正问题在于重复括号之间的部分:if我们需要接受其他类型的封闭圆括号('[]'或'{}'),我们需要重复'\\ w +'部分。 – max66