2011-11-30 24 views
7

Tôi muốn tạo một regex trong Perl để kiểm tra chuỗi ký tự trong một tập lệnh cụ thể. Đây sẽ là một cái gì đó như:Làm cách nào để chạy một Regex kiểm tra văn bản cho các ký tự trong một bảng chữ cái hoặc tập lệnh cụ thể?

$text =~ .*P{'Chinese'}.* 

Có một cách đơn giản để làm điều này, cho tiếng Anh nó khá dễ dàng bằng cách chỉ là thử nghiệm cho [a-zA-Z], nhưng đối với một kịch bản như Trung Quốc, hoặc một trong các Kịch bản tiếng Nhật, tôi không thể tìm ra bất kỳ cách nào để viết ngắn gọn từng ký tự một cách rõ ràng, điều này sẽ làm cho một số mã rất xấu. Ý tưởng? Tôi không thể là người đầu tiên/duy nhất muốn làm điều này.

+0

[Điều này] (http://stackoverflow.com/questions/4611425/how-to-count-the-chinese-word-in-a-file-using-regex-in-perl) có vẻ hữu ích. – TLP

+1

Liên quan: http://stackoverflow.com/questions/6937087/detect-chinese-character-using-perl#6939500 – daxim

Trả lời

9

Nhìn vào perldoc perluniprops, cung cấp danh sách đầy đủ các thuộc tính mà bạn có thể sử dụng với \p. Bạn sẽ quan tâm đến \p{CJK_Unified_Ideographs} và các sản phẩm có liên quan như \p{CJK_Symbols_And_Punctuation}. \p{Hiragana}\p{Katakana} cung cấp cho bạn kana. Ngoài ra còn có thuộc tính \p{Script=...} cho một số tập lệnh: \p{Han}\p{Script=Han} khớp với ký tự Hán (tiếng Trung), nhưng không có tương ứng \p{Script=Japanese}, khá đơn giản vì tiếng Nhật có nhiều tập lệnh.

+0

Tôi nghĩ [Hiragana] (http://en.wikipedia.org/wiki/Hiragana) và [Katakana ] (http://en.wikipedia.org/wiki/Katakana) chỉ được sử dụng bằng tiếng Nhật. – ikegami

+0

@ikegami: Đúng vậy. OP nói tiếng Nhật. –

+0

oops! Tôi bỏ lỡ điều đó. – ikegami

4

Có hai cách để thực hiện điều đó. Theo khối (\p{Block=...}) và theo tập lệnh (\p{Script=...}). Sau này có lẽ là tự nhiên hơn.

Tôi không biết nhiều về ngôn ngữ Trung Quốc, nhưng tôi nghĩ bạn muốn \p{Script=Han} aka \p{Han} cho tiếng Trung.

Nhật sử dụng ba kịch bản:

  • Kanij: \p{Script=Han} aka \p{Han}
  • Hiragana: \p{Script=Hiragana} aka \p{Hiragana} aka \p{Hira}
  • Katakana: \p{Script=Katakana} aka \p{Katakana} aka \p{Kana}

Bạn có thể mất một xem perluniprops để tìm cái bạn đang tìm kiếm hoặc bạn có thể sử dụng uniprops * để tìm những thuộc tính nào khớp với một ký tự cụ thể.

$ uniprops 4E2D 
U+4E2D ‹中› \N{CJK UNIFIED IDEOGRAPH-4E2D} 
    \w \pL \p{L_} \p{Lo} 
    All Any Alnum Alpha Alphabetic Assigned InCJK_UnifiedIdeographs 
    CJK_Unified_Ideographs L Lo Gr_Base Grapheme_Base Graph GrBase 
    Han Hani ID_Continue IDC ID_Start IDS Ideo Ideographic Letter 
    L_ Other_Letter Print UIdeo Unified_Ideograph Word XID_Continue 
    XIDC XID_Start XIDS X_POSIX_Alnum X_POSIX_Alpha X_POSIX_Graph 
    X_POSIX_Print X_POSIX_Word 

Để tìm ra ký tự nào trong một thuộc tính nhất định, bạn có thể sử dụng unichars *. (Đây là tính hữu hạn chế vì hầu hết các ký tự CJK không được đặt tên.)

$ unichars -au '\p{Han}' 
⺀ U+2E80 CJK RADICAL REPEAT 
⺁ U+2E81 CJK RADICAL CLIFF 
⺂ U+2E82 CJK RADICAL SECOND ONE 
⺃ U+2E83 CJK RADICAL SECOND TWO 
⺄ U+2E84 CJK RADICAL SECOND THREE 
⺅ U+2E85 CJK RADICAL PERSON 
⺆ U+2E86 CJK RADICAL BOX 
⺇ U+2E87 CJK RADICAL TABLE 
⺈ U+2E88 CJK RADICAL KNIFE ONE 
... 

* — unipropsunichars có sẵn từ các distro Unicode::Tussle.

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