我正在学习英语的正则表达式(正则表达式),虽然有些概念似乎适用于日语等其他语言,但我觉得好像很多其他语言都没有。例如,正则表达式的常见用法是查找单词是否具有非字母数字字符。我不知道这种技术和其他技术如何适用于日语,因为不仅有三种书写系统,而且汉字也非常复杂,并且范围比字母数字字符大得多。虽然我参加了许多日语课程,但我很欣赏有关这一主题的任何信息以及需要深入研究的领域,因为我对这个主题知之甚少。如果可能的话,我希望你的答案可以使用python和Java,因为那些是我熟悉的语言。谢谢你的帮助。
答案 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.UNICODE
或re.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官方网站on this web page可以更清楚地解释它们之间的区别。
就Java中正则表达式中的字符匹配而言,您可以使用Java 7以后的任何一种分类机制。
这是语法,如Oracle网站上的in this tutorial所示:
脚本:
\p{IsHiragana}
或\p{script=Hiragana}
阻止:
\p{InHiragana}
或\p{block=Hiragana}
请注意,在一种情况下为 “是” ,在另一种情况下为 “在” 。< / p>
接受的答案中指出的语法\p{Hiragana}
似乎不是有效的选项。我试过以防万一,但可以确认它对我不起作用。