C++ 11正则表达式IfThenElse - 单一,封闭的括号匹配或不匹配的括号
问题描述:
我如何定义一个C++相匹配的字符串或者11/ECMAScript的正则表达式兼容声明:C++ 11正则表达式IfThenElse - 单一,封闭的括号匹配或不匹配的括号
包含一个单一的,封闭,一对包含长度大于0的字母数字字符串的圆括号 - 例如正则表达式
"\(\w+\)"
,它正确匹配"(abc_123)"
,并忽略不正确的"(abc_123"
,"abc_123)"
和"abc_123"
。但是,上述表达式不会忽略包含多个平衡/不平衡包围的输入字符串 - 我想从匹配的结果中排除"((abc_123)"
,"(abc_123))"
和"((abc_123))"
。或单个,字母词,没有任何不平衡的括号 - 例如像正则表达式语句
"\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}"
说...]
答
不是你想怎么样,我想,和非真正优雅,但...
用“或”(|
),你应该获得更好胜于无解决方案基于"\\(\\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
}
你确定这可以通过常规的语言来表示? – MrEricSir
您是否愿意接受使用Boost.Regex而不是C++ 11正则表达式的解决方案?我认为如果你使用否定的后置断言可以做到这一点,但这些不被C++支持。11正则表达式 – harmic
它只需要大约四行代码直接检查这个匹配。为什么使用正则表达式使其复杂化? –