2012-09-12 46 views
6

Làm thế nào để thay thế tất cả "(" và ")" trong chuỗi có dấu chấm, trong Java? Tôi đã thử theo cách sau:Thay thế tất cả "(" và ")" trong một chuỗi trong Java

String url = "https://bitbucket.org/neeraj_r/url-shortner)"; 
url.replaceAll(")", "."); 
url.replaceAll(")", "."); 

Nhưng nó không hoạt động. Lỗi này là:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing 
')' 
) 
at java.util.regex.Pattern.error(Unknown Source) 
at java.util.regex.Pattern.compile(Unknown Source) 
at java.util.regex.Pattern.<init>(Unknown Source) 
at java.util.regex.Pattern.compile(Unknown Source) 
at java.lang.String.replaceAll(Unknown Source) 
at com.azzist.cvConversion.server.URLChecker.main(URLChecker.java:32) 

Tôi nghĩ rằng vấn đề này cũng sẽ có trong tất cả regex. Thêm \ trước ) không hoạt động.

Trả lời

13

Bạn có thể sử dụng replaceAll trong một đi:

url.replaceAll("[()]", ".") 

Giải thích:

  • [()] trận đấu cả hai () được áp dụng khung không cần phải được thoát bên trong nhóm [].

EDIT (như được chỉ ra bởi @Keppil):

Cũng lưu ý, String url là không thay đổi bởi sự thay thế, nó chỉ trả về một String mới với thay thế, vì vậy bạn sẽ phải làm :

url = url.replaceAll("[()]", "."); 
+0

Cảm ơn bạn. – Neeraj

11

Bạn cần phải thoát khỏi '('')' với "\\(""\\)" tương ứng:

url = url.replaceAll("\\)", "."); 
url = url.replaceAll("\\(", ".") 
+0

Có một lỗi nhỏ trong câu trả lời của bạn. Bạn chỉ thay thế ")". Nhưng điều này cũng không hiệu quả. Logic của bạn sẽ không hoạt động đối với "(". Url = url.replaceAll ("\\ (", "."); Sẽ không thay thế "(" – Neeraj

+0

@Neeraj Corrected - thanks. – munyengm

7

replaceAll() hy vọng một regex như tham số đầu tiên, và parantheses có ý nghĩa đặc biệt đó.

sử dụng replace() thay vì:

String url = "https://bitbucket.org/neeraj_r/url-shortner)"; 
url = url.replace("(", ".").replace(")", "."); 

Lưu ý rằng phần url = là rất quan trọng để lưu các kết quả của sự thay thế. Kể từ String s là không thay đổi, bản gốc String không thay đổi, nhưng một cái mới được tạo. Để giữ kết quả url cần phải trỏ đến thay thế này.

+0

Cả hai 'url.replace ("(" , ".") và url.replaceAll ("\\ (", ".") hoạt động tốt. Điểm ở đây là "url = url.replace (...)" Trong câu hỏi "url = ... Vì vậy, chuỗi sẽ được thay thế nhưng không được viết ở đâu đó –

+1

@emempe: Vâng, điều đó cũng quan trọng, nhưng lỗi trong ví dụ OP là do lỗi regex. Tôi sẽ thêm ghi chú về 'url = 'part too. – Keppil

+0

@Keppil Tôi muốn chuyển đổi tất cả" ("trong String. Bằng cách sử dụng .replace, tôi nghĩ rằng tôi chỉ có thể chuyển đổi lần xuất hiện đầu tiên. – Neeraj

1

Thêm một đơn \ sẽ không hoạt động, bởi vì điều đó sẽ cố gắng đánh giá \) là một ký tự đặc biệt được thoát mà không phải.

Bạn sẽ cần sử dụng "\)". Lần đầu tiên \ thoát lần thứ hai, tạo ra một "bình thường" \, mà lần lượt thoát khỏi các ), tạo ra một regex phù hợp chính xác một bế tắc đóng ).

Giải pháp mục đích chung là sử dụng Pattern.quote, lấy chuỗi tùy ý và trả về một regex khớp chính xác với chuỗi đó.

0

Phương pháp String#replaceAll hy vọng một biểu thức chính quy và ( cũng như ) được ký tự đặc biệt (đánh dấu nhóm), do đó bạn cần phải thoát khỏi họ là không đặc biệt url.replaceAll("\\)", ".");.

Ngoài ra, bạn có thể thay thế cả hai ký tự cùng một lúc bằng mẫu url.replaceAll("[()]", ".");. Bạn có thể thấy rằng trong bối cảnh này, các dấu ngoặc không được thoát. Đó là vì bối cảnh regEx - bên trong của [] chúng không có bất kỳ ý nghĩa đặc biệt nào.

Nhìn vào JavaDoc để biết thêm thông tin.

0

) là ký tự của regex nên bạn cần phải thoát khỏi nó. Hãy thử điều này:

url.replaceAll("\)", "\."); 
0

Sử dụng

url.replaceAll("\\)", ".").replaceAll("\\(", ".");; 
2
  1. String là không thay đổi.
  2. ) nên được thoát bằng 2 dấu gạch chéo ngược.

Vì vậy, các mã sẽ trông như thế này:

String url = "https://bitbucket.org/neeraj_r/url-shortner)"; 
// is you need to escape all of them, use "[()]" pattern, instead of "\\)" 
String s = url.replaceAll("\\)", "."); 
System.out.println(url); 
System.out.println(s); 

Và kết quả:

https://bitbucket.org/neeraj_r/url-shortner) 
https://bitbucket.org/neeraj_r/url-shortner. 
1

Bạn cũng có thể sử dụng org.apache.commons.lang.StringUtils.replace (String, Chuỗi, Chuỗi) không sử dụng regex

Từ thư viện commache commons http://commons.apache.org/

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