2012-05-30 305 views
14

我正在学习有关英文的正则表达式(正则表达式),虽然其中一些概念似乎适用于其他语言(如日语),但我觉得其他许多语言都不会。例如,常用的正则表达式是查找一个单词是否包含非字母数字字符。我不明白这种技术和其他技术如何为日本人工作,因为不仅有三种书写系统,而且日本汉字也非常复杂,并且比字母数字字符的范围要广泛得多。我会很感激关于这个话题的任何信息,以及更多的领域,因为我对这个主题知之甚少,尽管我已经参加了很多日语课程。如果可能的话,我希望你的答案能够使用python和Java,因为那些是我熟悉的语言。感谢您的帮助。日文中的正则表达式(正则表达式)

+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正则表达式对Unicode功能提供有限的支持。 Java更好,尤其是Java 7.

Java支持Unicode类别。例如,\p{L}(及其简写,\pL)匹配任何语言的任何字母。这包括日本的表意文字。

Java 7支持Unicode脚本,包括平假名,片假名,汉字和拉丁脚本,日文文本通常由这些脚本组成。您可以使用\p{Han},\p{Hiragana},\p{Katakana}\p{Latin}来匹配其中一个脚本中的任何字符。您可以将它们组合在一个字符类中,例如[\p{Han}\p{Hiragana}\p{Katakana}]。您可以使用大写字母P(如in,\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字符串可以,因此您可以使用例如Python正则表达式将代码点嵌入到正则表达式中。 \U0010FFFF(大写U后跟八个十六进制数字)。

的Java 7的(?U)UNICODE_CHARACTER_CLASS标志使得像\w\d字符类速记支持Unicode,所以他们将匹配日本的表意字符等(但请注意,\d仍然不匹配汉字像一二数字三四) 。默认情况下,Python 3使速记类可识别Unicode。在Python 2中,当您使用re.UNICODEre.U标志时,速记类可以识别Unicode。

你说得对,并非所有的正则表达式思想都同样适用于所有的脚本。有些东西(如字母套)对日文文本没有意义。

+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在其正则表达式语法中对Java功能(不包括Unicode脚本,类别,块等)的Unicode功能几乎没有支持。 – 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') #=>カタカナ 
相关问题