Khớp từ có chứa các ký tự ngoài a-zA-Z


15

Để ghép một từ người ta có thể sử dụng

\v(\w+)

Từ trợ giúp vim :h \w:

\ w ký tự từ: [0-9A-Za-z_]

Điều này hoạt động chính xác như được mô tả trong hướng dẫn. Tuy nhiên, tôi muốn ghép các từ có chứa các ký tự bên ngoài a-z, ví dụ prästgården . Thay vào đó, kết hợp biểu thức chính quy \v(\w+)với prästgården cho ba kết quả khớp:

prästgården
^^ ^^^ ^^^^

Làm thế nào để khớp các từ có chứa các ký tự bên ngoài a-z? Ngôn ngữ của tôi được đặt thành tiếng Anh và nếu có thể tôi muốn giữ nguyên như vậy.

Chỉnh sửa: Các từ có thể không thuộc về một miền địa phương, ví dụ:

prästgården
treść

Các lớp ký tự POSIX (ví dụ [[:alpha:]]\+trong trường hợp này) được cho là làm những gì bạn muốn ở đây, nhưng theo tài liệu Vim ( :help regex) thì không: "Những mục này chỉ hoạt động cho các ký tự 8 bit." Nó thực sự hoạt động ở đây với Vim 7.3 trên OS X 10.8, nhưng Vim 7.3 trên Linux không hoạt động, vì vậy tôi cho rằng có một cái gì đó cụ thể của Apple về Vim này cho phép nó. Bạn cũng sẽ thấy rằng thực hiện nó thông qua liên kết Vim Perl cũng thất bại, mặc dù Perl có hỗ trợ Unicode rất tốt. Bạn có thể cần phải chuyển sang tập lệnh Perl bên ngoài, để bạn có thể bật hỗ trợ Unicode đầy đủ.
Warren Young

Nhân tiện, nếu bạn đi với Perl, bạn muốn sử dụng \p{Word}thay vì một lớp ký tự POSIX. Có rất nhiều trường hợp ngoại lệ trong việc xử lý lớp ký tự POSIX của Perl, mà bạn tránh khi bạn sử dụng các thuộc tính Unicode thay thế.
Warren Young

Câu trả lời:


9

Vim (kể từ phiên bản 7.3) rất hạn chế đối với việc hỗ trợ các ký tự không phải ASCII theo mẫu. Đặc biệt, \wchỉ phù hợp với các chữ cái ASCII, tính hữu dụng hạn chế.

Có một vài mẫu lớp ký tự hỗ trợ Unicode. Điều bạn quan tâm là \I, cái mà lớn và khớp với các chữ cái và chỉ các chữ cái, cộng _@. Ít nhất là trên việc ép Debian (trong ngôn ngữ UTF-8), có lỗi; ví dụ ×÷được khớp như các chữ cái, nhưng tất cả các chữ cái có dấu Latinh dường như được nhận dạng chính xác. \Icó thể được cấu hình thông qua isidenttùy chọn, ít nhất là cho phần ASCII.

Nếu bạn muốn hỗ trợ Unicode nghiêm túc, bạn sẽ cần phải dựa vào một công cụ bên ngoài. Ví dụ: perl -C -e '/\p{L}/'để khớp các chữ cái UTF-8 (giả sử miền địa phương UTF-8).


2

Nó cũng hoạt động cho Cyrillic

\v\k

Một chút phức tạp và thất bại với Cyrillic

\v(\c[0-9a-z_[=a=][=c=][=e=][=i=][=l=][=n=][=o=][=r=][=s=][=t=][=u=][=y=][=z=]])

Doc .

Đã thử nghiệm trên Vim 7.4.


Tôi cũng sẽ thêm [=l=]vào danh sách sẽ bao gồm ł(ví dụ złoty), v.v. Nhưng điều này đã thất bại đối với Nga. Dù sao, cảm ơn đã chia sẻ.
Marco

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.