2013-03-26 37 views
5

Tôi hiện đang nhúng vào regex trong Java và muốn thử tìm các từ trùng lặp trong chuỗi. Nếu tôi đã nhập một chuỗi như 'This this is great.' Tôi đã sử dụng \\b(\\w+) \\1\\b, nhưng điều đó chỉ nhận ra hai từ trùng lặp, chẳng hạn như 'this this' trong một chuỗi.Tìm các từ trùng lặp trong chuỗi regex C/W

Bất kỳ trợ giúp nào về vấn đề này?

+0

Tại sao bạn muốn sử dụng regex cho điều này? Bạn chỉ có thể chuyển đổi thành một mảng String bằng cách tách và sau đó có nhiều tùy chọn để tìm ra các từ trùng lặp –

+0

Nếu bạn thực sự mới bắt đầu _dabble_ trong regex, điều này có lẽ quá phức tạp để bắt đầu ... Không đề cập đến thực tế là regex có lẽ là công cụ sai cho công việc. Điều này sẽ được ** rất nhiều ** dễ dàng hơn để làm với các phương pháp chuỗi cơ bản. – jahroy

+0

Tôi nên nói trước đây, nhưng tôi đang làm những ví dụ regex cho khóa học đại học/đại học của tôi, và ví dụ này là duy nhất còn lại. Tôi đã bị vướng vào nó hàng giờ! –

Trả lời

2

Thêm "bỏ qua trường hợp" chuyển (?i) để regex của bạn:

(?i)\\b(\\w+) \\1\\b 

Ngoài ra, bạn có thể gấp đầu vào thấp hơn trường hợp thứ nhất:

input.toLowerCase() 

Lưu ý: Nếu bạn đang sử dụng String.matches() , regex phải khớp với đầu vào toàn bộ số, vì vậy, bạn sẽ thêm .* vào cả hai đầu của regex:

.*(?i)\\b(\\w+) \\1\\b.* 
+0

Điều đó không hiệu quả đối với tôi, nó hoạt động với hai từ song song. Nhưng 'Điều này không hoạt động' thì không. –

+0

Những từ đó cạnh nhau ;-) – jahroy

+0

Tôi hiểu rằng: P, chỉ khi tôi sử dụng nhiều hơn hai từ trong một chuỗi, nó không nhận ra rằng cả hai từ (nằm cạnh nhau) đều giống nhau. –

1
String pattern = "\\b(\\w+)(\\b\\W+\\b\\1\\b)*"; 
Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); 

Bạn có thể sử dụng Matcher.group()Matcher.group(1) để thay thế tất cả các từ trùng lặp bằng phương pháp này.

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