2012-05-30 3 views
14

Я изучаю регулярные выражения (регулярное выражение) для английского языка, и хотя некоторые из концепций кажутся им применимыми к другим языкам, таким как японский, я чувствую, что многие другие не будут. Например, обычное использование регулярных выражений состоит в том, чтобы найти, имеет ли слово не буквенно-цифровые символы. Я не вижу, как эта техника, как и другие, будет работать на японском языке, поскольку есть не только три системы письма, но и кандзи также очень сложны и охватывают гораздо больший диапазон, чем альфа-числовые символы. Я был бы признателен за любую информацию по этой теме, а также за области, которые нужно изучить, поскольку у меня очень мало знаний по этому вопросу, хотя я взял много японских курсов. Если это вообще возможно, я бы хотел, чтобы ваши ответы использовали python и Java, поскольку это языки, с которыми мне удобно. Спасибо за помощь.Регулярные выражения (regex) на японском языке

+0

Большинство регулярных выражений реализации поддерживают Unicode. Отдельные вопросы для создания регулярных выражений - это отдельный вопрос. – SLaks

+0

@Something Jones: вы можете применять японские символы, используя шестнадцатеричное значение Unicode. е.g: \ uXXXX, в котором XXXX является значением символа Unicode. – jaselg

+0

Что-то, что может помочь: http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml. Обратите внимание, что он не отделяет китайский глиф от японского символа того же персонажа. – nhahtdh

ответ

10

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.

Вы правы, что не все идеи регулярных выражений переносятся одинаково хорошо ко всем сценариям. Некоторые вещи (например, обложка букв) просто не имеют смысла с японским текстом.

+0

Второй параграф, скорее всего, будет неправильным в соответствии с документацией Java 7. ** Вы проверили? ** Остальное я не могу проверить сейчас. – nhahtdh

+0

Регулятор Python версии 3 поддерживает Unicode примерно так же, как Java 7 для класса Pattern: http://docs.python.org/py3k/library/re.html – nhahtdh

+0

@nhahtdh, ваши комментарии не помогают. Да, Java поддерживает сценарии Unicode (описанные в моем втором абзаце) и не требует использования префикса «Is» (я не рекомендую использовать «Is», поскольку это делает его менее переносимым). И нет, Python 3 не имеет почти такой же поддержки функций Unicode в синтаксисе regex, как и Java (без юникодов, категорий, блоков и т. Д.). – slevithan

3

Классы символов Java делают что-то вроде того, что вы ищете. Это те, которые начинаются с \ p here.

+0

@nhahtdh: Пожалуйста, задайте вопрос о чем-то, в частности, чтобы попробовать. – Ashe

+0

Я только что узнал, почему я ошибаюсь, когда запускаю этот код: http://ideone.com/p3P9b на моем компьютере. Команда компиляции должна быть 'javac -encoding utf8 ' для правильной работы. – nhahtdh

6

Для 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') #=>カタカナ