2010-10-12 3 views
6

Possible en double:
Can regular expressions be used to match nested patterns?Regexp pour vérifier si des parenthèses sont équilibrés

Je vous écris une expression rationnelle pour vérifier si la chaîne d'entrée est une expression arithmétique correcte. Le problème est de vérifier s'il y a suffisamment de parenthèses d'ouverture et de fermeture.

expressions:

  1. (1)

  2. (((1)

  3. ((1))))

je pense préanalyse et lookbehind sont utiles ici mais pour l'instant je pourrais vérifier seulement une sorte. J'utilise Java, si c'est important.

+1

Ce n'est pas une langue régulière.. Vous aurez besoin de créer un analyseur, même s'il est très simple – eldarerathis

Répondre

4

Pour ce faire, vous devez utiliser un analyseur et non une regex. Voir this question.

+0

Juste une note qu'une expression rationnelle avec des constructions conditionnelles peut le faire (.NET ou perl): http://weblogs.asp.net/whaggard /archive/2005/02/20/377025.aspx – dsummersl

8

Vous ne devez pas utiliser l'expression régulière pour cela. Au lieu de cela, vous pouvez parcourir le caractère chaîne par caractère et suivre le niveau d'imbrication.

Initialement, l'imbrication est 0. Lorsque vous voyez un ( augmenter l'imbrication de 1, et lorsque vous voyez ) diminuer l'imbrication. L'expression est correctement équilibrée si l'imbrication finale est 0 et l'imbrication va jamais en dessous 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

Pourquoi ne pas simplement compter le parens comme ouverture et de fermeture ainsi?

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 

Bien sûr, cela ne vérifie que vous avez la bonne quantité - quelqu'un pourrait écrire «)) 3 * 4 ((» et il serait validé en utilisant cette méthode

+1

Avant l'ouverture de -, vérifiez si open est 0. Si c'est le cas, alors la vérification échouera, ce qui échouerait pour l'expression ')) 3 * 4 ((' ou ' (a + b)) - (3 * 4) '. – Riquochet

Questions connexes