日文正则表达式(regex)

日文正则表达式(regex),regex,unicode,multilingual,Regex,Unicode,Multilingual,我正在学习英语中的正则表达式(regex),尽管其中一些概念似乎适用于其他语言,如日语,但我觉得似乎其他许多语言都不适用。例如,正则表达式的一个常见用法是查找单词是否具有非字母数字字符。我不知道这项技术和其他技术如何适用于日语,因为日语不仅有三种书写系统,而且汉字也非常复杂,比字母数字字符的范围要大得多。我希望您能提供关于这个主题的任何信息,以及需要深入研究的领域,因为尽管我修过很多日语课程,但我对这个主题所知甚少。如果可能的话,我希望您的答案使用python和Java,因为这些是我熟悉的语言。

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

Java字符类的功能与您所寻找的类似。它们是以\p开头的。Python正则表达式对Unicode功能提供有限的支持。Java更好,尤其是Java7

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

Java7支持Unicode脚本,包括日语文本通常由平假名、片假名、韩语和拉丁语脚本组成。您可以使用
\p{Han}
\p{Hiragana}
\p{Katakana}
\p{Latin}
匹配其中一个脚本中的任何字符。您可以在字符类中组合它们,例如
[\p{Han}\p{Hiragana}\p{Katakana}]
。您可以使用大写字母
P
(如,
\P{Han}
)来匹配除汉字以外的任何字符

Java7支持Unicode块。除非在Android中运行代码(脚本不可用),否则通常应该避免使用块,因为它们不如Unicode脚本有用和准确。有许多与日语文本相关的块,包括
\p{InHiragana}
\p{InKatakana}
\p{InCJK\u统一表意文字}
\p{InCJK\u符号和标点符号}
,等等

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

Java 7
(?U)
UNICODE\U CHARACTER\U CLASS
标志使字符类速记,如
\w
\d
能够识别UNICODE,因此它们将匹配日文表意字符等(但请注意,
\d
仍不会匹配汉字等数字)一二三四). Python3默认情况下使速记类支持Unicode。在Python2中,当您使用
re.Unicode
re.U
标志时,速记类支持Unicode

你是对的,不是所有的正则表达式思想都能很好地应用到所有的脚本中。有些东西(比如字母大小写)对日文文本没有意义。

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

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

  • Unicode脚本(脚本中使用的所有字符,无论Unicode代码点如何,都可能来自不同的块)
  • Unicode块(用于特定目的/脚本的代码点范围-可能跨脚本,脚本可能跨块)
从Unicode官方网站上可以更清楚地解释这两者之间的区别

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

这是Oracle网站上显示的语法:

脚本:

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

块:

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

请注意,在一种情况下它的“是”,在另一种情况下它的“是”


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

大多数正则表达式实现都支持Unicode。编写哪种正则表达式是一个单独的问题。@Something Jones:你可以使用Unicode的十六进制值来应用日语字符。例如:\uxxxh XXXX是Unicode字符的值。这可能会有所帮助:。请注意,它不会将同一字符的中文字形与日文字形分开。根据Java 7文档,第二段很可能不正确。您测试过吗?其余部分我现在无法测试。Python版本3正则表达式或多或少支持UnicodeJava 7处理模式类的方式:@nhahtdh,您的评论没有帮助。是的,Java支持Unicode脚本(在我的第二段中描述),并且不需要“Is”前缀来使用它们(我建议不要使用“Is”,因为这会降低可移植性)不,Python 3在正则表达式语法中对Unicode功能的支持与Java(没有Unicode脚本、类别、块等)几乎不一样。我不确定它的“可移植性”有多差,脚本只在Java 7中受支持,而不是Java 6。文档中说脚本可以由
\p{IsHiragana}
\p指定{script=Hiragana}
,或
\p{sc=Hiragana}
,但它从来没有提到任何关于
p{Hiragana}
。我只是想确认一下。对于Python,虽然功能集不如Java丰富,但它可以使用
\w