如何运行为特定字母或脚本中的字符测试文本的正则表达式?

时间:2011-11-30 22:10:30

标签: regex perl

我想在Perl中制作一个正则表达式,用于测试特定脚本中字符的字符串。这将是:

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

有没有一种简单的方法可以做到这一点,对于英语而言,通过测试[a-zA-Z]非常容易,但是对于像中文这样的脚本,或者一个日文脚本,我无法弄明白这样做的方法是明确写出每个字符,这会产生一些非常难看的代码。想法?我不能成为第一个/唯一一个想要这样做的人。

2 个答案:

答案 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}为中文。

日语使用三个脚本:

  • Kanij:\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
...

* - unipropsunichars可从Unicode::Tussle发行版中获取。