Как я могу запустить регулярное выражение, которое проверяет текст на наличие символов в определенном алфавите или скрипте? - PullRequest
7 голосов
/ 01 декабря 2011

Я бы хотел сделать регулярное выражение в Perl, которое будет проверять строку на наличие символов в конкретном скрипте.Это было бы что-то вроде:

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

Есть ли простой способ сделать это, для английского это довольно просто, просто протестировав [a-zA-Z], но для сценария, такого как китайский, или одиниз японских сценариев я не могу придумать какой-либо способ сделать это за исключением явного написания каждого символа, что могло бы привести к некоторому очень уродливому коду.Идеи?Я не могу быть первым / единственным человеком, который хотел это сделать.

Ответы [ 2 ]

9 голосов
/ 01 декабря 2011

Посмотрите на 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} нет, просто потому, что в японском языке несколько сценариев.

4 голосов
/ 01 декабря 2011

Есть два способа сделать это.По блоку (\p{Block=...}) и по сценарию (\p{Script=...}).Последнее, вероятно, более естественное.

Я не знаю много о китайских языках, но я думаю, что вы хотите \p{Script=Han} aka \p{Han} для китайского.

Японский использует три сценария:

  • 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}

Вы можете взглянуть на 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...