2010-10-12 24 views
6

thể trùng lặp:
Can regular expressions be used to match nested patterns?biểu thức chính quy để kiểm tra xem ngoặc được cân bằng

Tôi viết một regexp để kiểm tra xem chuỗi đầu vào là một biểu thức số học chính xác. Vấn đề đang kiểm tra nếu có đủ mở và đóng ngoặc đơn.

Expressions:

  1. (1)

  2. (((1)

  3. ((1))))

Tôi nghĩ lookahead và lookbehind có ích ở đây nhưng bây giờ tôi chỉ có thể kiểm tra một loại. Tôi đang sử dụng Java, nếu nó quan trọng.

+1

Đây không phải là một ngôn ngữ thông thường.. Bạn sẽ cần phải tạo một trình phân tích cú pháp, ngay cả khi nó là một phần tử rất đơn giản – eldarerathis

Trả lời

4

Bạn cần phải sử dụng trình phân tích cú pháp để thực hiện việc này, chứ không phải regex. Xem this question.

+0

Chỉ cần lưu ý rằng một regexp với các cấu trúc có điều kiện có thể thực hiện điều này (.NET hoặc perl): http://weblogs.asp.net/whaggard /archive/2005/02/20/377025.aspx – dsummersl

8

Bạn không nên sử dụng cụm từ thông dụng để thực hiện việc này. Thay vào đó bạn có thể lặp qua ký tự chuỗi theo ký tự và theo dõi cấp độ lồng nhau.

Ban đầu lồng nhau là 0. Khi bạn thấy số ( tăng số lồng nhau bằng 1 và khi bạn thấy số an toàn làm tổ giảm. Biểu thức được cân bằng chính xác nếu việc lồng cuối cùng là 0 và tổ không bao giờ thấp hơn 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

Tại sao không chỉ đếm số lần mở và đóng như vậy?

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 

Tất nhiên điều này chỉ kiểm tra rằng bạn có đúng số lượng - ai đó có thể viết ')) 3 * 4 ((' và nó sẽ được xác nhận bằng phương pháp này

+1

Trước khi mở--, hãy kiểm tra nếu mở là 0. Nếu sau đó nó thất bại trong việc kiểm tra. Điều đó sẽ không thành công cho biểu thức ')) 3 * 4 ((' hoặc ' (a + b)) - (3 * 4) '. – Riquochet

Các vấn đề liên quan