2012-02-09 27 views
6

Cho phép nói rằng tôi có một từ: "Aiavärav". Biểu thức \w+ phải ghi lại từ này, nhưng chữ "ä" cắt giảm một nửa. Thay vì "Aiavärav", tôi nhận được "Aia". Regex chính xác cho những từ có chứa những chữ cái không ascii là gì?Biểu thức chính quy của Java không nhận dạng các ký tự từ các ngôn ngữ khác dưới dạng ký tự từ (ví dụ: w)

+0

Tôi đã sao chép từ của bạn và đưa vào chuỗi, tôi đã sử dụng cụm từ thông dụng \ w + và tôi có thể nhận được từ chính xác. Tôi đang thử nghiệm với C#. –

+0

Im sử dụng Java. Ngoài ra tôi đã thử nghiệm với myregextester.com và nó vẫn không nhận ra toàn bộ từ. – jyriand

+0

Có thể bạn muốn xem [Unicode letters] (http://www.regular-expressions.info/unicode.html)? '\ p {L} +' – Wiseguy

Trả lời

12

Theo the documentation, \w chỉ phù hợp [a-zA-Z_0-9] trừ khi bạn chỉ định UNICODE_CHARACTER_CLASS cờ:

Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS) 

hoặc nhúng một (?U) trong mẫu:

Pattern.compile("(?U)\\w+") 

một trong hai mà đòi hỏi phải có JDK 1.7 (ví dụ, Java 7).

Nếu bạn không có Java 7, bạn có thể khái quát \w sang Unicode bằng cách sử dụng \p{L} ("chữ"; như [a-zA-Z], nhưng không phải ASCII cụ thể) và \p{N} ("number"; như [0-9], nhưng không phải theo ASCII cụ thể):

Pattern.compile("[\\p{L}_\\p{N}]+") 

Nhưng nó có vẻ như thể bạn đang tìm kiếm thực tế lời, theo nghĩa thông thường (như trái ngược với cảm giác ngôn ngữ lập trình), và không cần phải hỗ trợ chữ số và dấu gạch dưới ? Trong trường hợp đó, bạn chỉ có thể sử dụng \p{L}:

Pattern.compile("\\p{L}+") 

(Bằng cách này, các dấu ngoặc nhọn thực sự không bắt buộc — bạn có thể viết \pL thay vì p{L}\pN thay vì \p{N} — nhưng mọi người thường bao gồm họ dù sao, vì chúng được yêu cầu cho các loại nhiều chữ cái như \p{Lu} "chữ hoa".)

+0

Xin lưu ý rằng việc nhúng (? U) "... có thể áp đặt hình phạt hiệu suất". từ http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS – reallynice

+0

@niconic: Tài liệu mà bạn liên kết đến thực sự đề cập đến 'UNICODE_CHARACTER_CLASS' thay vì' (? U) ', nhưng dù bằng cách nào, tôi nghĩ rằng phần đắt tiền là phù hợp với các thuộc tính ký tự Unicode (so với các nhóm ký tự ASCII). Vì đó là chính xác những gì OP đang cố gắng làm, nó không thực sự là một "hình phạt hiệu suất" trong trường hợp của mình, và có lẽ sẽ áp dụng cho * bất kỳ cách tiếp cận nào mà anh ta có thể làm. – ruakh

+0

Có thể tôi sai, nhưng trong liên kết 'UNICODE_CHARACTER_CLASS' tôi cũng đọc' Chế độ UNICODE_CHARACTER_CLASS cũng có thể được kích hoạt thông qua biểu thức cờ nhúng (? U). ', vì vậy tôi nghĩ rằng chúng ta đang nói về cùng một thứ. Tôi có hiểu nhầm điều gì đó không? Tất nhiên câu trả lời của bạn phù hợp với nhu cầu, tôi chỉ muốn chỉ ra rằng (bởi vì tôi thấy mình trong một trường hợp tương tự và hiệu suất cho tôi là cần thiết) – reallynice

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