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)
Trả lời
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}
và \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".)
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
@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
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
- 1. Biểu thức chính quy Trừ các ký tự này
- 2. Biểu thức chính quy Ký tự đại diện
- 3. Biểu thức chính quy Java để khớp với các ký tự khoảng trắng _all_
- 4. biểu thức chính quy không có ký tự
- 5. Biểu thức chính quy Javascript "Ký tự không gian đơn"
- 6. Từ ngắt bằng ngôn ngữ không có dấu cách giữa các từ (ví dụ: Châu Á)?
- 7. Thoát các ký tự đặc biệt trong Java Biểu thức chính quy
- 8. Xác thực mật khẩu biểu thức chính quy Javascript có các ký tự đặc biệt
- 9. Có các trình duyệt trình tự khác giải thích dưới dạng các ký tự đặc biệt HTML không?
- 10. Notepad ++ thay thế biểu thức chính quy cho các ký tự hỗn hợp
- 11. Tại sao Java cho phép các ký tự điều khiển trong số nhận dạng của nó?
- 12. thoát các ký tự định dạng trong java String.format
- 13. Đọc các ký tự từ một từ? Java
- 14. Biểu thức chính quy PHP để đối sánh các từ
- 15. notepad không nhận dạng được \ n ký tự?
- 16. Java - biểu thức chính quy cho định dạng get số
- 17. Parsing inflected ngôn ngữ không phải thứ tự từ (ví dụ Latin)
- 18. Các ký tự đặc biệt của Android
- 19. Chương trình nhận dạng ký tự quang học cho ảnh
- 20. Lấy các ký tự unicode của một ngôn ngữ trong Java
- 21. Tách ký tự đầu tiên của các từ
- 22. Regex cho các ký tự từ trong bất kỳ ngôn ngữ nào
- 23. Đối số chức năng truyền dưới dạng chuỗi ký tự?
- 24. Xóa các ký tự từ chuỗi
- 25. biểu thức chính quy không làm việc cho ký tự đặc biệt cụ thể trong Perl
- 26. Nhập tệp văn bản dưới dạng chuỗi ký tự đơn
- 27. Mẹo lập trình với ngôn ngữ/ký tự tiếng Nhật
- 28. Biến đổi ký tự unicode dạng dải
- 29. Sự khác biệt giữa các loại tồn tại của Scala và ký tự đại diện của Java bằng ví dụ?
- 30. Các quy tắc phân loại R của vectơ ký tự là gì?
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#. –
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
Có thể bạn muốn xem [Unicode letters] (http://www.regular-expressions.info/unicode.html)? '\ p {L} +' – Wiseguy