日语中的正则表达式(正则表达式)

时间:2012-05-30 02:16:26

标签: regex unicode multilingual

我正在学习英语的正则表达式(正则表达式),虽然有些概念似乎适用于日语等其他语言,但我觉得好像很多其他语言都没有。例如,正则表达式的常见用法是查找单词是否具有非字母数字字符。我不知道这种技术和其他技术如何适用于日语,因为不仅有三种书写系统,而且汉字也非常复杂,并且范围比字母数字字符大得多。虽然我参加了许多日语课程,但我很欣赏有关这一主题的任何信息以及需要深入研究的领域,因为我对这个主题知之甚少。如果可能的话,我希望你的答案可以使用python和Java,因为那些是我熟悉的语言。谢谢你的帮助。

4 个答案:

答案 0 :(得分:13)

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(如,\P{Han})来匹配除Han脚本中的字符之外的任何字符。

Java 7支持Unicode块。除非在Android中运行代码(脚本不可用),否则通常应该避免使用块,因为它们不如Unicode脚本有用和准确。日语文本中有各种各样的块,包括\p{InHiragana}\p{InKatakana}\p{InCJK_Unified_Ideographs}\p{InCJK_Symbols_and_Punctuation}等。

Java和Python都可以使用\uFFFF引用单个代码点,其中FFFF是任何四位十六进制数。 Java 7可以引用任何Unicode代码点,包括基本多语言平面之外的那些,使用例如\x{10FFFF}。 Python正则表达式不支持21位Unicode,但Python字符串不支持,因此您可以使用例如正则表达式在正则表达式中嵌入代码点。 \U0010FFFF(大写U后跟八位十六进制数字。)

Java 7 (?U)UNICODE_CHARACTER_CLASS标志使\w\d字符类缩写变为Unicode,因此它们将匹配日语表意字符等(但请注意)对于像一二三四这样的数字,\d仍然不匹配汉字。默认情况下,Python 3使速记类识别Unicode。在Python 2中,当您使用re.UNICODEre.U标志时,速记类可识别Unicode。

你说得对,并非所有正则表达式的想法都能很好地适用于所有脚本。有些东西(例如字母大小写)对日文文本没有意义。

答案 1 :(得分:7)

对于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') #=>カタカナ

答案 2 :(得分:3)

Java角色类的功能与您所寻找的类似。它们以\ p here开头。

答案 3 :(得分:0)

在Unicode中,有两种方法可以对来自不同书写系统的字符进行分类。他们是

  • Unicode脚本(脚本中使用的所有字符,与Unicode代码点无关-可能来自不同的块)
  • Unicode块(用于特定目的/脚本的代码点范围-可能跨越脚本,脚本可能跨越块)

从Unicode官方网站on this web page可以更清楚地解释它们之间的区别。

就Java中正则表达式中的字符匹配而言,您可以使用Java 7以后的任何一种分类机制。

这是语法,如Oracle网站上的in this tutorial所示:

脚本:

\p{IsHiragana}\p{script=Hiragana}

阻止:

\p{InHiragana}\p{block=Hiragana}

请注意,在一种情况下为 “是” ,在另一种情况下为 “在” 。< / p>

接受的答案中指出的语法\p{Hiragana}似乎不是有效的选项。我试过以防万一,但可以确认它对我不起作用。