检测圆括号,包括打开和关闭

Detect round bracket, both open and close

本文关键字:包括打 圆括号 检测      更新时间:2023-10-16

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

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

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

一些帮助会很好。谢谢!

或者

你可以写它:

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(将被忽略

正则表达式中的

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] == ')');
}

删除锚点^$

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

^$是行的开头和结尾的锚点。如果你只是想找出是否有任何括号,而不一定在行的开头或结尾,你可以省略这些括号。

此外,由于您匹配长度为 0 或更大的空格,除非您匹配以删除它(将其替换为空字符串),否则您也可以省略它。

那给你留下了

const regex Parser::rxOpenBracket = regex("\(");
const regex Parser::rxCloseBracket = regex("\)"); 

或者,如果您愿意,

const regex Parser::rxOpenBracket = regex("[(]");
const regex Parser::rxCloseBracket = regex("[)]");