2013-03-05 50 views
19

Tôi cố gắng để thực hiện một phân chia tương tự như sau:Groovy/Java chia chuỗi trên ngoặc "("

println "Hello World(1)".split("W"); 

Output:

[Hello , orld(1)] 

Tôi muốn thực hiện phân chia này:

println "Hello World(1)".split("("); 

Nhưng tôi thấy:

Caught: java.util.regex.PatternSyntaxException: Unclosed group near index 1 (

Có cách nào để thoát khỏi dấu ngoặc đơn này không? Bất kỳ trợ giúp được đánh giá cao.

+1

bạn cần phải thoát khỏi nó như thế này '\\ (' – ant

+1

mà thoát không hoạt động @ant –

+1

xin lỗi double back slash – ant

Trả lời

40
println "Hello World(1)".split("\\("); 
+0

Điều đó làm điều đó cho tôi, cảm ơn! Tôi chỉ thử duy nhất \ –

17

Phương thức split có mẫu biểu thức chính quy.

Nếu bạn muốn chia trên "chỉ là một chuỗi bình thường", bạn có thể sử dụng Pattern.quote trích dẫn chuỗi đầu tiên:

println "Hello World(1)".split(Pattern.quote("(")) 
+0

hoặc bạn có thể chia nhỏ trên '" \\ ("', lần đầu tiên thoát '\\ (' thành '\ (', sau đó công cụ regex thoát '\ (' thành một chữ cái ngoặc đơn – jedyobidan

+0

Điều này thật thú vị .. Tôi không nghĩ đến việc sử dụng Pattern.quote() trong trường hợp này. Câu trả lời hay: Jon –

+0

@jedyobidan: Vâng đó chính xác là những gì 'Pattern.quote' sẽ làm - nó chỉ có nghĩa là bạn không cần phải làm điều đó bằng tay ... –

0

bạn phải thoát khỏi nhân vật khung đúng

println "Hello World(1)".split("\\(") 
1

Bạn cũng có thể sử dụng một lần thoát duy nhất khi sử dụng cú pháp regex gốc groovy:

assert "Hello World(1)".split(/\(/) == ["Hello World", "1)"] 
0

Kể từ khi chia chỉ chấp nhận regex, bạn phải chuyển cho nó dưới dạng ký tự thoát. Đối với điều này, bạn phải thêm một dấu gạch chéo ở phía trước của nó

\(

Nhưng trên có một lỗi biên dịch bởi vì nó được phân tách như một hợp lệ thoát nhân vật như:

\t Tab 
\n New Line or Line Feed 
\r Carriage Return 

Vì vậy, bạn phải vượt qua một ý nghĩa nhân vật phi (Ví dụ ngoặc đơn) với 2 dấu xồ nguợc:

\\(

Cuối cùng:

println "Hello World(1)".split("\\("); 

HOẶC bạn cũng có thể làm được mọi sự bằng chức năng java BUILTIN của lớp Pattern tên quote:

println "Hello World(1)".split(Pattern.quote("(")); 
Các vấn đề liên quan