我想在Perl中制作一个正则表达式,用于测试特定脚本中字符的字符串。这将是:
$text =~ .*P{'Chinese'}.*
有没有一种简单的方法可以做到这一点,对于英语而言,通过测试[a-zA-Z]非常容易,但是对于像中文这样的脚本,或者一个日文脚本,我无法弄明白这样做的方法是明确写出每个字符,这会产生一些非常难看的代码。想法?我不能成为第一个/唯一一个想要这样做的人。
答案 0 :(得分:9)
查看perldoc perluniprops,其中提供了可与\p
一起使用的详尽属性列表。您会对\p{CJK_Unified_Ideographs}
及相关属性感兴趣,例如\p{CJK_Symbols_And_Punctuation}
。 \p{Hiragana}
和\p{Katakana}
给你假名。许多脚本还有\p{Script=...}
属性:\p{Han}
和\p{Script=Han}
匹配汉字符(中文),但没有相应的\p{Script=Japanese}
,因为日语有多个脚本。
答案 1 :(得分:4)
有两种方法可以做到这一点。按块(\p{Block=...}
)和脚本(\p{Script=...}
)。后者可能更自然。
我不太了解中文,但我认为您希望\p{Script=Han}
又称\p{Han}
为中文。
日语使用三个脚本:
\p{Script=Han}
又名\p{Han}
\p{Script=Hiragana}
又名\p{Hiragana}
又名\p{Hira}
\p{Script=Katakana}
又名\p{Katakana}
又名\p{Kana}
您可以查看perluniprops找到您要查找的那个,或者您可以使用uniprops
*来查找与特定字符匹配的属性。
$ 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
要找出给定媒体资源中的哪些字符,您可以使用unichars
*。 (这个用途有限,因为大多数CJK字符都没有命名。)
$ 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
...
* - uniprops
和unichars
可从Unicode::Tussle发行版中获取。