2010-10-12 30 views
6

Duplicar posible:
Can regular expressions be used to match nested patterns?Regexp para comprobar si están equilibrados paréntesis

estoy escribiendo una expresión regular para comprobar si la cadena de entrada es una expresión aritmética correcta. El problema es verificar si hay suficientes paréntesis de apertura y cierre.

Expresiones:

  1. (1)

  2. (((1)

  3. ((1))))

creo búsqueda hacia delante y de búsqueda hacia atrás son útiles aquí, pero por ahora solo pude verificar un tipo. Estoy usando Java, si es importante.

+1

Esto no es un lenguaje regular.. Necesitarás crear un analizador, incluso si es muy simple. – eldarerathis

Respuesta

4

Necesita utilizar un analizador para hacer esto, no una expresión regular. Ver this question.

+0

Solo una nota que una expresión regular con construcciones condicionales puede hacer esto (.NET o perl): http://weblogs.asp.net/whaggard /archive/2005/02/20/377025.aspx – dsummersl

8

No debe usar la expresión regular para hacer esto. En su lugar, puede iterar sobre la cadena carácter por carácter y realizar un seguimiento del nivel de anidación.

Inicialmente, la anidación es 0. Cuando ve un (, aumente el agrupamiento en 1, y cuando vea ) disminuya la anidación. La expresión correcta es equilibrada si el anidamiento final es 0 y el anidamiento nunca baja de 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; 
} 
0

¿Por qué no contar la apertura y el cierre de parens como tal?

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 

Por supuesto esto sólo comprueba que tienes la cantidad correcta - alguien podría escribir ')) 3 * 4 ((' y sería validado utilizando este método

+1

Antes de abrir--, compruebe si está abierto 0. Si es así, fallará el control. Eso fallaría con la expresión ')) 3 * 4 ((' o ' (a + b)) - (3 * 4) '. – Riquochet

Cuestiones relacionadas