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

Som*_*nes 15 regex unicode multilingual

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

sle*_*han 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(如in \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后跟8个十六进制数字)在正则表达式中嵌入代码点.

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

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


aka*_*zah 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') #=>????
Run Code Online (Sandbox Code Playgroud)