2017-04-21 16 views
6

Hãy xem xét các chuỗi sau:Looping qua RegEx phù hợp và thay thế các trận đấu hiện nay

Ông ra lệnh cho một chiếc bánh pizza với cá cơm. Thật không may, đó không phải là điều anh muốn. Bên cạnh đó, pizza với nấm, pepperoni và cá cơm là tốt hơn nhiều so với bánh pizza bình thường với cá cơm.

Giả sử bạn cần thay đổi pizza with (ingredients) thành pizza with (ingredients) on a thin crust.

Để làm điều đó, tôi đã thiết lập một Regex:

(?i:pizza with [a-zA-Z,\s]*?anchovies) 

này chụp ba trận đấu. Sau đó, tôi tiến hành thêm các on a thin crust cho mỗi trận đấu bằng cách sử dụng đoạn mã sau:

Pattern p = Pattern.compile("(?i:pizza with [a-zA-Z,\s]*?anchovies)"); 
Matcher m = p.matcher(string); 
while(m.find()) 
{ 
    string = string.replace(m.group(), m.group() + "on a thin crust."); 
} 

Sản lượng này sau đó sẽ là:

Ông ra lệnh cho một chiếc bánh pizza với cá cơm trên một lớp vỏ mỏng trên mỏng vỏ trái đất. Thật không may, đó không phải là điều anh muốn. Bên cạnh đó, pizza với nấm, pepperoni và cá cơm là tốt hơn nhiều so với bánh pizza bình thường với cá cơm trên một lớp vỏ mỏng trên một lớp vỏ mỏng.

gì đã xảy ra:

Trận đấu đầu tiên pizza with anchovies cũng giống như trận đấu cuối cùng. Do đó, sử dụng String.replace khiến trận đấu đầu tiên và cuối cùng thay đổi thành pizza with anchovies on a thin crust. Vì, chúng tôi đang lặp qua tất cả các trận đấu, trận đấu cuối cùng vẫn sẽ xảy ra và chức năng thay thế cũng sẽ thay thế trận đấu đầu tiên (kể từ trận đấu đầu tiên và trận đấu cuối cùng giống nhau). Do đó, chúng tôi nhận được gấp đôi on a thin crust.

Q:

Có cách nào để thay thế một trận đấu Regex tại chỉ là trận đấu hiện tại?

+0

Nếu bạn thấy câu trả lời của tôi hữu ích/làm việc cho bạn, xin vui lòng xem xét upvoting/accepting. –

Trả lời

6

Làm điều đó với một đơn replaceAll sử dụng $0 backreference cho toàn bộ trận đấu:

String s = "He ordered a pizza with anchovies. Unfortunately, it wasn't the thing he wanted. Besides, pizza with mushroom, pepperoni and anchovies is much better than the normal pizza with anchovies."; 
s = s.replaceAll("(?i)pizza with [a-zA-Z,\\s]*?anchovies", "$0 on a thin crust"); 
System.out.println(s); 
// => He ordered a pizza with anchovies on a thin crust. Unfortunately, it wasn't the thing 
// he wanted. Besides, pizza with mushroom, pepperoni and anchovies on a thin crust is 
// much better than the normal pizza with anchovies on a thin crust. 

Xem Java demo

Bằng cách này, bạn sẽ tránh được thay thế đã thay thế các văn bản kể từ replaceAll() xử lý tất cả, nhiều, không sự xuất hiện chồng chéo của các chất nền đáp ứng mẫu regex của bạn.

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