2012-11-08 46 views
5

Trong ruby ​​1.9.3, công cụ regex không xử lý (\ u00A0) làm không gian (\ s). Điều này thường là một con số thấp cho tôi.Xử lý regexp Ruby của nbsp

Vì vậy, câu hỏi của tôi là, điều này có thay đổi trong 2.0 không? Nếu không, có cách nào để khỉ vá một giải pháp?

Trả lời

7

tính Sử dụng Unicode (bạn cần phải khai báo một mã hóa mã nguồn phù hợp để làm việc này):

# encoding=utf-8 
if subject ~= /\p{Z}/ 
    # subject contains whitespace or other separators 

hoặc sử dụng các lớp nhân vật POSIX:

if subject ~= /[[:space:]]/ 

Theo the docs, \s sẽ chỉ phù hợp với [ \t\r\n\f] hiện tại và trong tương lai.

+0

Cảm ơn Tim, \ p {Z} thật thú vị. Bạn có thể giải thích những gì bạn có nghĩa là bởi các dấu phân cách khác? – pguardiario

+0

@pguardiario: Xin lỗi, tôi bằng cách nào đó đã bỏ lỡ nhận xét của bạn. Tiêu chuẩn Unicode định nghĩa nhiều dấu tách khác xuất hiện để được sử dụng chủ yếu trong các ngôn ngữ phương Đông, trong đó các từ không nhất thiết phải tách biệt rõ ràng bằng khoảng trắng. –

0

Trong Ruby, tôi khuyên bạn nên sử dụng lớp ký tự Unicode của "tách Space" \p{Zs}:

/\p{Zs}/u =~ "\xC2\xA0" 
/\p{Zs}/u =~ "\u00A0" 
/\p{Zs}/u =~ HTMLEntities.new.decode(' ') 

Xem Ruby-tài liệu hướng dẫn để biết thêm Unicode character properties.

Lưu ý: Đảm bảo rằng chuỗi đầu vào của bạn là mã hóa UTF-8 hợp lệ. Cũng có các khoảng trống trong các mã hóa khác, ví dụ: "\ xA0" trong ISO-8859-1 (Latin1). More info on the "non-breaking space".

FYI: Trong hầu hết các hương vị và ngôn ngữ lập trình RegExp hỗ trợ Unicode, lớp ký tự \s thường bao gồm tất cả các ký tự từ thuộc tính "separator" Unicode \p{Z} (như đã đề cập bởi Tim Pietcker); Tuy nhiên, JavaRuby là các ngoại lệ phổ biến ở đây và \s chỉ khớp với [ \t\r\n\f].

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