2012-05-30 34 views
14

Ich lerne über Reguläre Ausdrücke (Regex) für Englisch und obwohl einige der Konzepte scheinen, als ob sie auf andere Sprachen wie Japanisch anwenden würden, habe ich das Gefühl, als ob viele andere nicht. Zum Beispiel wird regex häufig verwendet, um herauszufinden, ob ein Wort nicht alphanumerische Zeichen enthält. Ich sehe nicht, wie diese Technik und andere für Japanisch funktionieren würden, da es nicht nur drei Schriftsysteme gibt, sondern Kanji auch sehr komplex sind und eine viel größere Reichweite haben als alphanumerische Zeichen. Ich würde mich über Informationen zu diesem Thema freuen und auch über Bereiche, in denen ich mehr darüber in Betracht ziehen kann, da ich sehr wenig über das Thema weiß, obwohl ich viele Japanischkurse belegt habe. Wenn es möglich wäre, würde ich gerne Ihre Antworten Python und Java verwenden, da dies die Sprachen sind, mit denen ich mich auskenne. Danke für Ihre Hilfe.Reguläre Ausdrücke (Regex) in Japanisch

+0

meisten Regex-Implementierungen unterstützen Unicode. Welche Art von Regexes zu schreiben ist eine separate Frage. – SLaks

+0

@Something Jones: Sie können japanische Zeichen mit dem Hexadezimalwert von Unicode anwenden. e.g: \ uXXXX wobei XXXX der Wert des Unicode-Zeichens ist. – jaselg

+0

Etwas, das helfen kann: http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml. Beachten Sie, dass chinesische Schriftzeichen nicht von japanischen Schriftzeichen desselben Schriftzeichens getrennt werden. – nhahtdh

Antwort

10

Python Regexes bieten eingeschränkte Unterstützung für Unicode-Funktionen. Java ist besser, insbesondere Java 7.

Java unterstützt Unicode-Kategorien. Beispielsweise kann \p{L} (und seine Kurzschrift \pL) mit jedem Buchstaben in jeder Sprache übereinstimmen. Dies schließt japanische ideographische Zeichen ein.

Java 7 unterstützt Unicode-Skripts, einschließlich der Hiragana-, Katakana-, Han- und Latein-Skripts, aus denen japanischer Text normalerweise besteht. Sie können jedes Zeichen in einem dieser Skripts mit \p{Han}, \p{Hiragana}, \p{Katakana} und \p{Latin} abgleichen. Sie können sie in einer Zeichenklasse wie [\p{Han}\p{Hiragana}\p{Katakana}] kombinieren. Sie können einen Großbuchstaben P (wie in, \P{Han}) verwenden, um ein beliebiges Zeichen außer denen im Han-Skript zu finden.

Java 7 unterstützt Unicode-Blöcke. Sofern Sie Ihren Code nicht in Android ausführen (wo keine Skripts verfügbar sind), sollten Sie Blöcke generell vermeiden, da sie weniger nützlich und genauer als Unicode-Skripte sind. Es gibt eine Vielzahl von Blöcken von japanischen Text bezogen, einschließlich \p{InHiragana}, \p{InKatakana}, \p{InCJK_Unified_Ideographs}, \p{InCJK_Symbols_and_Punctuation} usw.

Sowohl Java und Python auf einzelne Codepunkte beziehen können mit \uFFFF, wo FFFF ist jede vierstellige Zahl headecimal. Java 7 kann sich auf einen beliebigen Unicode-Codepunkt beziehen, einschließlich derjenigen, die jenseits der Basic Multilingual Plane liegen, unter Verwendung von z. \x{10FFFF}. Python-Regexes unterstützen keinen 21-Bit-Unicode, aber Python-Strings tun dies, sodass Sie einen Code-Punkt in eine Regex einbetten können, indem Sie z. \U0010FFFF (Großbuchstaben U gefolgt von acht Hex-Ziffern).

Die Java 7 (?U) oder UNICODE_CHARACTER_CLASS Flagge macht Zeichenklasse Kürzel wie \w und \d Unicode bewusst, so dass sie japanische ideographic Zeichen übereinstimmen, usw. (aber beachten Sie, dass \d noch nicht Kanji Match für Zahlen wie 一二 三四) . In Python 3 werden Stenoklassen standardmäßig als Unicode erkannt. In Python 2 sind Kurzschreibungsklassen Unicode-fähig, wenn Sie das Flag re.UNICODE oder re.U verwenden.

Sie haben Recht, dass nicht alle Regex-Ideen für alle Skripte gleichermaßen geeignet sind. Einige Dinge (wie Briefumschläge) sind mit japanischem Text einfach nicht sinnvoll.

+0

Der zweite Absatz ist sehr wahrscheinlich in der Java 7 Dokumentation falsch. ** Hast du getestet? ** Den Rest kann ich jetzt nicht testen. – nhahtdh

+0

Python Version 3 Regex unterstützt Unicode mehr oder weniger auf die gleiche Art und Weise wie Java 7 für die Musterklasse: http://docs.python.org/py3k/library/re.html – nhahtdh

+0

@nhahtdh, Ihre Kommentare sind nicht hilfreich. Ja, Java unterstützt Unicode-Skripte (wie in meinem zweiten Absatz beschrieben) und erfordert nicht das Präfix "Is", um sie zu verwenden (ich empfehle, "Is" nicht zu verwenden, da es dadurch weniger portabel ist). Und nein, Python 3 hat in seiner Regex-Syntax nicht annähernd die gleiche Unterstützung für Unicode-Funktionen wie Java (keine Unicode-Skripte, Kategorien, Blöcke usw.). – slevithan

3

Die Java-Zeichenklassen tun so etwas wie das, wonach Sie suchen. Sie sind diejenigen, die mit \ p here beginnen.

+0

@nhahtdh: Bitte stellen Sie eine Frage zu etwas speziell zu versuchen. – Ashe

+0

Ich habe gerade herausgefunden, warum ich falsch, wenn ich diesen Code ausführen: http://ideone.com/p3P9b auf meinem Computer. Der Kompilierungsbefehl sollte 'javac -encoding utf8 ' sein, damit er korrekt funktioniert. – nhahtdh

6

Für 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') #=>カタカナ