检测圆形支架,包括打开和关闭

时间:2014-02-28 11:58:18

标签: c++ regex

我需要打破"(a+b*9 )-10"之类的表达式来提取/检测()

这就是我现在所拥有的,但两种情况都不起作用。

const regex Parser::rxOpenBracket = regex("^\\s*[(]\\s*$");

const regex Parser::rxCloseBracket = regex("^\\s*([)])\\s*$"); 

一些帮助会很好。谢谢!

4 个答案:

答案 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("[)]");