19

我正在学习英语的正则表达式(regex),虽然其中一些概念似乎适用于其他语言,如日语,但我觉得好像很多其他语言不会。例如,正则表达式的一个常见用途是查找一个单词是否包含非字母数字字符。我看不出这种技术以及其他技术如何适用于日语,因为不仅有三种书写系统,而且汉字也非常复杂,并且比字母数字字符的范围要大得多。我将不胜感激有关此主题的任何信息以及更多需要研究的领域,因为尽管我参加了许多日语课程,但我对该主题的了解很少。如果可能的话,我希望你的答案是使用 python 和 Java,因为这些是我熟悉的语言。感谢您的帮助。

4

4 回答 4

18

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})来匹配除汉字之外的任何字符。

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}. \U0010FFFFPython 正则表达式不支持 21 位 Unicode,但 Python 字符串支持,因此您可以使用 eg (大写U后跟八个十六进制数字)在正则表达式中嵌入一个代码点。

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

您是对的,并非所有正则表达式的想法都同样适用于所有脚本。有些东西(例如字母大小写)对日文文本没有意义。

于 2012-05-30T04:29:53.680 回答
10

对于 Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re
 
kanji = u'漢字'
hiragana = u'ひらがな'
katakana = u'カタカナ'
text = kanji + hiragana + katakana

#Match Kanji
regex = u'[\u4E00-\u9FFF]+' # == u'[一-龠々]+'
match = re.search(regex, text, re.U)
print match.group().encode('utf-8') #=> 漢字

#Match Hiragana
regex = u'[\u3040-\u309Fー]+' # == u'[ぁ-んー]+'
match = re.search(regex, text, re.U)
print match.group().encode('utf-8') #=> ひらがな

#Match Katakana
regex = u'[\u30A0-\u30FF]+' # == u'[ァ-ヾ]+'
match = re.search(regex, text, re.U)
print match.group().encode('utf-8') #=>カタカナ
于 2014-05-11T09:22:16.940 回答
4

Java 字符类的功能类似于您正在寻找的东西。它们是以 \p here开头的。

于 2012-05-30T02:38:13.280 回答
0

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

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

这些之间的区别在官方 Unicode 网站的这个网页上得到了更清楚的解释。

在 Java 中的正则表达式中匹配字符方面,您可以使用 Java 7 以来的任何一种分类机制。

这是语法,如Oracle 网站上的本教程中所示:

脚本:

要么\p{IsHiragana}_\p{script=Hiragana}

堵塞:

要么\p{InHiragana}_\p{block=Hiragana}

请注意,在一种情况下是"Is",在另一种情况下是"In"

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

于 2019-09-09T12:41:06.830 回答