Câu hỏi này là một phần mở rộng của Do C++11 regular expressions work with UTF-8 strings?Phạm vi của UTF-8 nhân vật trong C++ 11 Regex
#include <regex>
if (std::regex_match ("中", std::regex("中"))) // "\u4e2d" also works
std::cout << "matched\n";
Chương trình được biên soạn trên Mac Mountain Lion với clang++
với các tùy chọn sau:
clang++ -std=c++0x -stdlib=libc++
Mã trên hoạt động. Đây là một phạm vi tiêu chuẩn regex "[一-龠々〆ヵヶ]"
để khớp với bất kỳ ký tự Kanji hoặc Trung Quốc nào của Nhật Bản. Nó hoạt động trong Javascript và Ruby, nhưng tôi không thể có vẻ để có được phạm vi làm việc trong C++ 11, ngay cả với việc sử dụng một phiên bản tương tự [\u4E00-\u9fa0]
. Mã bên dưới không khớp với chuỗi.
if (std::regex_match ("中", std::regex("[一-龠々〆ヵヶ]")))
std::cout << "range matched\n";
Thay đổi ngôn ngữ cũng không hữu ích. Ý tưởng nào?
EDIT
Vì vậy, tôi đã phát hiện ra rằng tất cả các dãy tác dụng nếu bạn thêm một +
đến cùng. Trong trường hợp này [一-龠々〆ヵヶ]+
, nhưng nếu bạn thêm {1}
[一-龠々〆ヵヶ]{1}
thì nó không hoạt động. Hơn nữa, nó dường như vượt qua ranh giới của nó. Nó sẽ không khớp với các ký tự latin, nhưng nó sẽ khớp với は
là \u306f
và ぁ
là \u3041
. Cả hai đều nằm bên dưới \u4E00
nhahtdh cũng đề xuất regex_search cũng hoạt động mà không cần thêm +
nhưng vẫn chạy cùng một vấn đề như trên bằng cách kéo các giá trị ngoài phạm vi của nó. Chơi với các địa phương một chút là tốt. Mark Ransom cho rằng nó xử lý chuỗi UTF-8 như một tập hợp các byte ngu ngốc, tôi nghĩ rằng đây có thể là những gì nó đang làm.
Tiếp tục đẩy lý thuyết cho rằng UTF-8 là nhận được lộn xộn một số cách, [a-z]{1}
và [a-z]+
trận a
, nhưng chỉ [一-龠々〆ヵヶ]+
trận đấu bất kỳ ký tự, không [一-龠々〆ヵヶ]{1}
.
Trình biên dịch là gì? – nhahtdh
clang ++ -std = C++ 0x -stdlib = libC++ trên Mac Mountain Lion – MCH
Một số thử nghiệm và tôi đã tìm thấy một giải pháp, thêm '+' vào cuối phạm vi – MCH