我需要打破"(a+b*9 )-10"
之类的表达式来提取/检测(
和)
。
这就是我现在所拥有的,但两种情况都不起作用。
const regex Parser::rxOpenBracket = regex("^\\s*[(]\\s*$");
const regex Parser::rxCloseBracket = regex("^\\s*([)])\\s*$");
一些帮助会很好。谢谢!
答案 0 :(得分:3)
或者你可以写下来:
const regex Parser::bracketPair = regex("\\(.+?\\)");
表达式的翻译如下:
\(.+?\)
\( => The opening bracket (escaped as ( would indicate a group in regex)
. => Any character
* => Zero or more times (referring to the .)
? => Lazy, stop as soon as possible (referring to the *)
\) => End bracket, also escaped
通过使用此功能,您只能找到以左括号开头的匹配,后跟无或任意数量的字符,直到找到右括号。
例如,(hello world)
将被处理,但)hello world(
将被忽略
答案 1 :(得分:2)
\s
匹配空格,^
匹配字符串的开头,$
匹配结尾。因此,实际上,您的正则表达式只匹配包含单个左/右括号的字符串,可选地在空格后面/之后。不允许其他角色。
如果你真的只是在寻找括号中的字符,那么正则表达式就有点过分了。只需使用std::string::find_first_of()
:
std::string data("(a+b*9 )-10");
for (std::size_t idx = data.find_first_of("()"); idx != data.npos; idx = data.find_first_of("()", idx + 1))
{
//idx now holds the index of a parenthesis:
assert(data[idx] == '(' || data[idx] == ')');
}
答案 2 :(得分:1)
删除锚点^
和$
:
const regex Parser::rxOpenBracket = regex("\\s*[(]\\s*");
const regex Parser::rxCloseBracket = regex("\\s*([)])\\s*");
答案 3 :(得分:1)
^
和$
是该行的开头和结尾的锚点。如果您只是想知道是否任何括号 ,而不一定是在行的开头或结尾,您可以将它们保留。
此外,由于您匹配长度为0或更长的空格,除非您要匹配以删除它(将其替换为空字符串),您也可以将其保留。
离开你了
const regex Parser::rxOpenBracket = regex("\\(");
const regex Parser::rxCloseBracket = regex("\\)");
或者,如果您愿意,
const regex Parser::rxOpenBracket = regex("[(]");
const regex Parser::rxCloseBracket = regex("[)]");