可能重复:
Can regular expressions be used to match nested patterns?
我正在编写一个regexp来检查输入字符串是否是正确的算术表达式。问题是检查是否有足够的开括号和右括号。
表达式:
(1)
(((1)
((1))))
我认为前瞻和后视在这里很有用但是现在我只能检查一种。如果重要的话,我正在使用Java。
答案 0 :(得分:9)
您不应该使用正则表达式来执行此操作。相反,您可以逐个字符地迭代字符串并跟踪嵌套级别。
最初嵌套为0.当您看到(
将嵌套增加1时,以及当您看到)
减少嵌套时。如果最终嵌套为0且嵌套永远不会低于0,则表达式会正确平衡。
public static boolean checkParentheses(String s) {
int nesting = 0;
for (int i = 0; i < s.length(); ++i)
{
char c = s.charAt(i);
switch (c) {
case '(':
nesting++;
break;
case ')':
nesting--;
if (nesting < 0) {
return false;
}
break;
}
}
return nesting == 0;
}
答案 1 :(得分:4)
您需要使用解析器来执行此操作,而不是正则表达式。请参阅this question。
答案 2 :(得分:0)
为什么不算这样的开幕式和闭幕式呢?
String expression = "((1+x) - 3 * 4(6*9(12+1)(4+(2*3+(4-4)))))";
int open = 0;
for(int x = 0; x < open; x++){
if(expression[x] == '(')
open++;
else if(expression[x] == ')')
open--;
}
if (open != 0)
// Not a valid expression
当然这只会检查你是否有合适的金额 - 有人可以写'))3 * 4(('并且它将使用这种方法验证。