2012-06-02 39 views
5

Tôi có một chuỗi dài. Tôi muốn thay thế tất cả các trận đấu với một phần của regex phù hợp (nhóm).Thay chuỗi bằng một phần của regex phù hợp

Ví dụ:

String = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>". 

Tôi muốn thay thế tất cả các từ "is" bởi, chúng ta hãy nói, "<h1>is</h1>". Các trường hợp nên vẫn giống như bản gốc. Vì vậy, các chuỗi thức tôi muốn là:

This <h1>is</h1> a great day, <h1>is</h1> it not? If there <h1>is</h1> something, 
THIS <h1>IS</h1> it. <b><h1>is</h1></b>. 

Các regex tôi đã cố gắng:

Pattern pattern = Pattern.compile("[.>, ](is)[.<, ]", Pattern.CASE_INSENSITIVE); 
+2

Khi bạn thử, điều gì đã xảy ra? –

+0

Mẫu phù hợp. Những gì tôi không hiểu là làm thế nào để thay thế. – varunl

Trả lời

8

Lớp Matcher thường được sử dụng kết hợp với Pattern. Sử dụng phương pháp Matcher.replaceAll() để thay thế tất cả các trận đấu trong chuỗi

String str = "This is a great day..."; 
Pattern p = Pattern.compile("\\bis\\b", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(str); 
String result = m.replaceAll("<h1>is</h1>"); 

Lưu ý: Sử dụng \b lệnh regex sẽ phù hợp trên một ranh giới từ (như khoảng trắng). Điều này hữu ích khi sử dụng để đảm bảo rằng chỉ có từ "là" được so khớp chứ không phải từ có chứa các chữ "i" và "s" (giống như "đảo").

4

Như thế này:

str = str.replaceAll(yourRegex, "<h1>$1</h1>"); 

Các $1 nghĩa là nội dung bắt bởi nhóm # 1 trong regex của bạn.

+0

Nhược điểm của giải pháp này là nó sẽ luôn phân biệt chữ hoa chữ thường. Không có cách nào để xác định regex là phân biệt chữ hoa chữ thường. – Michael

+2

@Michael - Chỉ cần thêm một sửa đổi '(? I)' vào đầu regex nếu bạn cần phân biệt chữ hoa chữ thường. –

+0

Tôi không biết điều đó.Bỏ qua bình luận của tôi. :( – Michael

0

Đơn giản chỉ cần sử dụng backreference cho điều đó.

"This is a great day, is it not? If there is something, THIS IS it. <b>is</b>".replaceAll("[.>, ](is)[.<, ]", "<h1>$2</h1>"); nên làm.

+0

Một lần nữa, bạn không thể yêu cầu regex phân biệt chữ hoa chữ thường với giải pháp này – Michael

+0

Không bao giờ, bạn có thể thêm chuỗi regex bằng '(? I)' để làm cho nó không phân biệt chữ hoa chữ thường. – Michael

3

câu trả lời của Michael là tốt hơn, nhưng nếu bạn tình cờ đặc biệt chỉ muốn [.>, ][.<, ] như ranh giới, bạn có thể làm điều đó như thế này:

String input = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>"; 
Pattern p = Pattern.compile("(?<=[.>, ])(is)(?=[.<, ])", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(input); 
String result = m.replaceAll("<h1>$1</h1>"); 
1
yourStr.replaceAll("(?i)([.>, ])(is)([.<, ])","$1<h1>$2</h1>$3") 

(?i) để chỉ bỏ qua trường hợp; bọc tất cả mọi thứ bạn muốn sử dụng lại với dấu ngoặc vuông, sử dụng lại chúng với $ 1 $ 2 và $ 3, nối chúng vào những gì bạn muốn.

0

Nó có thể là một bổ sung muộn, nhưng nếu có ai đang tìm kiếm này như
Tìm kiếm 'điều' và cũng ông cần 'Something' quá để được thực hiện như kết quả,

Pattern p = Pattern.compile ("([^] ) là ([^ \.])");
Kết quả chuỗi = m.replaceTất cả ("< \ h1> $ 1is $ 2 </h1>");

sẽ cho kết quả < \ h1> Cái gì đó </h1> quá

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