2013-03-31 113 views
12

Tôi muốn xóa dấu ngoặc đơn bằng cách sử dụng biểu thức chính quy Java nhưng tôi phải đối mặt với lỗi No group 1 vui lòng xem mã của tôi và trợ giúp tôi.Xóa dấu ngoặc đơn khỏi chuỗi bằng cách sử dụng java regex

public String find_parenthesis(String Expr){ 
     String s; 
     String ss; 
     Pattern p = Pattern.compile("\\(.+?\\)"); 
     Matcher m = p.matcher(Expr); 
     if(m.find()){ 
      s = m.group(1); 
      ss = "("+s+")"; 
      Expr = Expr.replaceAll(ss, s); 
      return find_parenthesis(Expr); 
     } 
     else 
      return Expr; 
    } 

và nó là chính tôi:

public static void main(String args[]){ 
    Calculator c1 = new Calculator(); 
    String s = "(4+5)+6"; 
    System.out.println(s); 
    s = c1.find_parenthesis(s); 
    System.out.println(s); 
} 
+0

Để chụp nhóm, bạn cần phải có một cặp dấu ngoặc đơn chưa được thoát trong regex của mình. Tuy nhiên, giả sử bạn thực hiện thay đổi này, phần còn lại của mã chỉ cần đặt lại dấu ngoặc đơn, phải không? –

+0

Tại sao bạn cần regex cho điều này? –

+0

@KennethK. Tôi cần nó để phân tích cú pháp công thức – Ehsan

Trả lời

1

Bạn không thể làm điều này với một regex ở tất cả. Nó sẽ không xóa khớp với các dấu ngoặc đơn, chỉ cần trái đầu tiên và bên phải đầu tiên, và sau đó bạn sẽ không thể nhận được kết quả chính xác từ biểu thức. Bạn cần một trình phân tích cú pháp cho các biểu thức. Có một cái nhìn xung quanh để phân tích cú pháp ezpresssion gốc đệ quy, thuật toán shunting sân Dijkstra, vv

+0

Dấu ngoặc đơn của tôi không được lồng nhau, Nhưng Cảm ơn bạn đã trả lời – Ehsan

+0

@Ehsan Nếu bạn có toàn quyền kiểm soát đầu vào, vì bạn phải có khả năng khẳng định điều đó, Tôi không hiểu tại sao bạn cần một bộ phân tích biểu hiện. Trong mọi trường hợp, bình luận của tôi là viết tắt. Bạn cần một trình phân tích cú pháp cho các biểu thức. Các phương thức Ad-hoc sẽ không hoạt động. Bạn đang làm điều này một cách sai lầm. Sự cố sẽ nổi lên khi bạn đến để xử lý quyền ưu tiên của toán tử. Làm đúng. Có thực sự không có thay thế. – EJP

+0

Có, trong mọi trường hợp bình luận của bạn phân tích cú pháp theo cách của tôi là viết tắt, và tôi không bao giờ nói rằng trong phân tích công thức theo cách của tôi là chính xác, Nhưng tôi chỉ gặp lỗi trên regex và tôi đặt câu hỏi để giải quyết nó – Ehsan

2

Bạn nhận được lỗi vì regex của bạn không có bất kỳ nhóm nào, nhưng tôi đề nghị bạn sử dụng điều này đơn giản hơn nhiều, một cách tiếp cận dòng:

expr = expr.replaceAll("\\((.+?)\\)", "$1"); 
23

phương pháp đơn giản nhất là chỉ cần loại bỏ tất cả ngoặc từ chuỗi, bất kể họ được cân bằng hay không.

String replaced = "(4+5)+6".replaceAll("[()]", ""); 

đúng xử lý cân bằng đòi hỏi phân tích cú pháp (hoặc REs thực sự xấu xí mà chỉ phù hợp với độ sâu hạn chế, hoặc “thông minh” với nhiều lần thay thế biểu thức chính quy). Đối với hầu hết các trường hợp, độ phức tạp như vậy là quá mức cần thiết; điều đơn giản nhất có thể hoạt động là đủ tốt.

9

Những gì bạn muốn là thế này: s = s.replaceAll("[()]","");

Để biết thêm về regex, hãy truy cập regex tutorial.

1

Cụm từ thông dụng định nghĩa một lớp ký tự bao gồm bất kỳ ký tự trắng nào (\ s, được thoát bằng \ s vì chúng ta đang đi qua một chuỗi), dấu gạch ngang (thoát bởi dấu gạch ngang) các lớp ký tự) và dấu ngoặc đơn. Hãy thử mã hoạt động.

phoneNumber.replaceAll("[\\s\\-()]", ""); 
-1

Tôi biết tôi rất muộn ở đây. Nhưng, chỉ trong trường hợp bạn vẫn đang tìm kiếm một câu trả lời tốt hơn. Nếu bạn muốn loại bỏ tất cả dấu ngoặc mở và đóng từ một chuỗi, bạn có thể sử dụng một phương pháp rất đơn giản như thế này:

String s = "(4+5)+6"; 
s=s.replaceAll("\\(", "").replaceAll("\\)",""); 

Nếu bạn đang sử dụng này:

s=s.replaceAll("()", ""); 

bạn đang hướng dẫn các mã để tìm kiếm () không có trong chuỗi của bạn. Thay vào đó, bạn nên cố gắng loại bỏ dấu ngoặc đơn một cách riêng biệt.

Để giải thích một cách chi tiết, hãy xem xét các mã bên dưới:

String s = "(4+5)+6"; 
String s1=s.replaceAll("\\(", "").replaceAll("\\)",""); 
System.out.println(s1); 
String s2 = s.replaceAll("()", ""); 
System.out.println(s2); 

Kết quả cho mã này sẽ là:

4 + 5 + 6

(4 + 5) + 6

Ngoài ra, chỉ sử dụng replaceAll chỉ khi bạn cần regex. Trong các trường hợp khác, replace chỉ hoạt động tốt. Xem dưới đây:

String s = "(4+5)+6"; 
String s1=s.replace("(", "").replace(")",""); 

Output:

4 + 5 + 6

Hope this helps!

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