2013-07-22 36 views
12

Tôi cần phải viết một regex, có thể xác định một từ có bộ ký tự lặp lại tại số kết thúc. Theo đoạn mã sau, bộ ký tự lặp lại là An. Tôi cần phải viết một regex để điều này sẽ được phát hiện và hiển thị.Viết regex để phát hiện các ký tự lặp lại

Theo mã sau, \\w sẽ khớp với bất kỳ ký tự từ nào (bao gồm chữ số, chữ cái hoặc ký tự đặc biệt). Nhưng tôi chỉ muốn xác định các ký tự tiếng Anh.

String stringToMatch = "IranAnAn"; 
Pattern p = Pattern.compile("(\\w)\\1+"); 
Matcher m = p.matcher(stringToMatch); 
if (m.find()) 
{ 
    System.out.println("Word contains duplicate characters " + m.group(1)); 
} 

CẬP NHẬT

Word contains duplicate characters a 
Word contains duplicate characters a 
Word contains duplicate characters An 
+3

Có bao nhiêu ký tự được coi là "lặp lại"? Bạn có muốn gắn cờ 'chuối' (mặc dù đó là một từ hợp lệ) và' mama' (chỉ lặp lại các bộ). Làm thế nào về 'zoo' - lặp lại một ký tự đơn - hoặc' tomtom' (lặp lại ba ký tự). Nếu bạn muốn kết hợp "chỉ các ký tự tiếng Anh", hãy sử dụng '[A-Za-z]' để ký tự khớp. – Floris

Trả lời

8

Bạn muốn nắm bắt như nhiều nhân vật trong bộ của bạn càng tốt, vì vậy thay vì (\\w) bạn nên sử dụng (\\w+) và bạn muốn chuỗi là lúc kết thúc, vì vậy bạn cần để thêm $ (và tôi đã gỡ bỏ các + sau \\1 mà không phải là hữu ích để phát hiện sự lặp lại: chỉ có một sự lặp lại là cần thiết):

Pattern p = Pattern.compile("(\\w+)\\1$"); 

Chương trình của bạn sau đó xuất ra An như mong đợi.

Cuối cùng, nếu bạn chỉ muốn chụp ký tự ascii, bạn có thể sử dụng [a-zA-Z] thay vì \\w:

Pattern p = Pattern.compile("([a-zA-Z]+)\\1$"); 

Và nếu bạn muốn nhân vật thiết lập để có ít nhất 2 nhân vật:

Pattern p = Pattern.compile("([a-zA-Z]{2,})\\1$"); 
+0

Không, nó không hoạt động. tôi đã thêm đầu ra tôi đã đưa ra. Nó cũng phát hiện ra 'a'. Tôi chỉ muốn phát hiện các ký tự liên tiếp. –

+0

@sharonHwk Tôi không chắc mình hiểu. Tôi nghĩ rằng với đầu vào 'IranAnAn', bạn dự kiến ​​sẽ tìm thấy' An' - đó không phải là ý của bạn? Trong bản cập nhật của bạn, tại sao 'a' được coi là ký tự lặp lại? – assylias

+0

Tôi chỉ muốn nó xuất ra khi nó phát hiện lặp lại 'An'. Nhưng nó xuất ra khi nó phát hiện lặp lại 'a'. –

1

Nếu theo "chỉ các ký tự tiếng Anh", bạn có nghĩa là AZ và az, thì regex tiếp theo sẽ hoạt động:

".*([A-Za-z]{2,})\\1$" 
+0

Không, nó không hoạt động. tôi đã thêm đầu ra tôi đã đưa ra. Nó cũng phát hiện ra 'a'. Tôi chỉ muốn phát hiện các ký tự liên tiếp. –

+2

Trong [unicode table] (http://unicode-table.com/en/#0060) giữa 'A' và' z' cũng có các ký tự khác như '[' \ ']' '^' '_'' \ ''. '[A-Za-z]' chính xác hơn. – Pshemo

+0

@Pshemo cảm ơn bạn đã nhập, tôi không biết vấn đề đó! –

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