Я изучаю регулярные выражения (регулярное выражение) для английского языка, и хотя некоторые из концепций кажутся им применимыми к другим языкам, таким как японский, я чувствую, что многие другие не будут. Например, обычное использование регулярных выражений состоит в том, чтобы найти, имеет ли слово не буквенно-цифровые символы. Я не вижу, как эта техника, как и другие, будет работать на японском языке, поскольку есть не только три системы письма, но и кандзи также очень сложны и охватывают гораздо больший диапазон, чем альфа-числовые символы. Я был бы признателен за любую информацию по этой теме, а также за области, которые нужно изучить, поскольку у меня очень мало знаний по этому вопросу, хотя я взял много японских курсов. Если это вообще возможно, я бы хотел, чтобы ваши ответы использовали python и Java, поскольку это языки, с которыми мне удобно. Спасибо за помощь.Регулярные выражения (regex) на японском языке
ответ
Python regexes предлагает ограниченную поддержку функций Unicode. Java лучше, особенно Java 7.
Java поддерживает категории Юникод. Например, \p{L}
(и его сокращенная версия, \pL
) соответствует любой букве на любом языке. Сюда относятся японские идеографические персонажи.
Java 7 поддерживает сценарии Unicode, включая скрипты Hiragana, Katakana, Han и Latin, которые, как правило, состоят из японского текста. Вы можете сопоставить любой символ в одном из этих сценариев, используя \p{Han}
, \p{Hiragana}
, \p{Katakana}
и \p{Latin}
. Вы можете комбинировать их в классе символов, таком как [\p{Han}\p{Hiragana}\p{Katakana}]
. Вы можете использовать верхний регистр P
(как в, \P{Han}
), чтобы соответствовать любому символу, кроме символов в скрипте Хан.
Java 7 поддерживает блоки Unicode. Если вы не используете свой код на Android (где скрипты недоступны), вы должны избегать блоков, поскольку они менее полезны и точны, чем скрипты Unicode. Есть целый ряд блоков, связанные с японским текстом, в том числе \p{InHiragana}
, \p{InKatakana}
, \p{InCJK_Unified_Ideographs}
, \p{InCJK_Symbols_and_Punctuation}
и т.д.
Оба Java и Python могут относиться к отдельным точкам коды с использованием \uFFFF
, где FFFF
является любым четырехзначный числом headecimal. Java 7 может ссылаться на любую кодовую точку Unicode, включая те, которые находятся за пределами базовой многоязычной плоскости, используя, например, \x{10FFFF}
. Режимы Python не поддерживают 21-разрядный Unicode, но строки Python делают, поэтому вы можете вставлять точку кода в регулярное выражение, например, \U0010FFFF
(верхний регистр U
, а затем восемь шестнадцатеричных цифр).
Java-7 (?U)
или UNICODE_CHARACTER_CLASS
флаг делает класс символов Shorthands как \w
и \d
знают Unicode, так что они будут соответствовать японским идеографических символов и т.д. (но учтите, что \d
все еще не соответствуют кандзи для чисел, как 一二 三四) , Python 3 делает по умолчанию сокращенные классы Unicode. В Python 2 сокращенные классы являются Unicode, когда вы используете флаг re.UNICODE
или re.U
.
Вы правы, что не все идеи регулярных выражений переносятся одинаково хорошо ко всем сценариям. Некоторые вещи (например, обложка букв) просто не имеют смысла с японским текстом.
Второй параграф, скорее всего, будет неправильным в соответствии с документацией Java 7. ** Вы проверили? ** Остальное я не могу проверить сейчас. – nhahtdh
Регулятор Python версии 3 поддерживает Unicode примерно так же, как Java 7 для класса Pattern: http://docs.python.org/py3k/library/re.html – nhahtdh
@nhahtdh, ваши комментарии не помогают. Да, Java поддерживает сценарии Unicode (описанные в моем втором абзаце) и не требует использования префикса «Is» (я не рекомендую использовать «Is», поскольку это делает его менее переносимым). И нет, Python 3 не имеет почти такой же поддержки функций Unicode в синтаксисе regex, как и Java (без юникодов, категорий, блоков и т. Д.). – slevithan
Классы символов Java делают что-то вроде того, что вы ищете. Это те, которые начинаются с \ p here.
Для Python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
kanji = u'漢字'
hiragana = u'ひらがな'
katakana = u'カタカナ'
str = kanji + hiragana + katakana
#Match Kanji
regex = u'[\u4E00-\u9FFF]+' # == u'[一-龠々]+'
match = re.search(regex, str, re.U)
print match.group().encode('utf-8') #=> 漢字
#Match Hiragana
regex = u'[\u3040-\u309Fー]+' # == u'[ぁ-んー]+'
match = re.search(regex, str, re.U)
print match.group().encode('utf-8') #=> ひらがな
#Match Katakana
regex = u'[\u30A0-\u30FF]+' # == u'[ァ-ヾ]+'
match = re.search(regex, str, re.U)
print match.group().encode('utf-8') #=>カタカナ
Большинство регулярных выражений реализации поддерживают Unicode. Отдельные вопросы для создания регулярных выражений - это отдельный вопрос. – SLaks
@Something Jones: вы можете применять японские символы, используя шестнадцатеричное значение Unicode. е.g: \ uXXXX, в котором XXXX является значением символа Unicode. – jaselg
Что-то, что может помочь: http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml. Обратите внимание, что он не отделяет китайский глиф от японского символа того же персонажа. – nhahtdh