2012-05-30 4 views
14

영어에 대한 정규 표현식 (정규식)에 대해 배우고 있지만 일부 개념은 일본어와 같은 다른 언어에도 적용될 수 있지만 많은 사람들이 그렇지 않은 것처럼 느낍니다. 예를 들어 정규 표현식의 일반적인 용도는 단어에 영숫자가 아닌 문자가 있는지 확인하는 것입니다. 필자는이 기술뿐만 아니라 다른 사람이 일본어에 대해 어떻게 작동 하는지를 보지 못합니다. 그러나 한자도 매우 복잡하며 영숫자 문자보다 훨씬 넓은 범위에 걸쳐 있습니다. 많은 일본어 과정을 밟았지만 주제에 대한 지식이 거의 없으므로이 주제에 대한 정보는 물론 관심 분야에 대한 정보를 제공해 주시면 감사하겠습니다. 가능하다면 Python과 Java를 사용하는 답변이 내가 익숙한 언어 인 것처럼하고 싶습니다. 도와 줘서 고마워.정규 표현식 (정규식)

+0

대부분의 정규식 구현은 유니 코드를 지원합니다. 어떤 종류의 정규 표현식은 별도의 질문입니다. – SLaks

+0

@Something Jones : 유니 코드의 16 진수 값을 사용하여 일본어 문자를 적용 할 수 있습니다. 이자형.g : \ uXXXX 여기서 XXXX는 유니 코드 문자의 값입니다. – jaselg

+0

도움이 될만한 것 : http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml. 중국어 문자와 같은 문자의 일본어 문자는 분리되지 않습니다. – nhahtdh

답변

10

파이썬 정규 표현식은 유니 코드 기능을 제한적으로 지원합니다. Java, 특히 Java 7이 더 좋습니다.

Java는 유니 코드 범주를 지원합니다. 예 : \p{L} (및 그 약식은 \pL)은 모든 언어의 모든 문자와 일치합니다. 여기에는 일본어 표의 문자가 포함됩니다.

Java 7은 일본어 텍스트가 일반적으로 구성되는 히라가나, 가타카나, 한글 및 라틴어 스크립트를 포함한 유니 코드 스크립트를 지원합니다. 이 스크립트 중 하나의 문자는 \p{Han}, \p{Hiragana}, \p{Katakana}\p{Latin}을 사용하여 일치시킬 수 있습니다. [\p{Han}\p{Hiragana}\p{Katakana}]과 같은 문자 클래스에서 이들을 결합 할 수 있습니다. 대문자 P (예 : \P{Han})을 사용하여 Han 스크립트의 문자를 제외한 모든 문자를 일치시킬 수 있습니다.

Java 7은 유니 코드 블록을 지원합니다. Android에서 코드를 실행하지 않는 한 (스크립트를 사용할 수없는 경우) 일반적으로 유니 코드 스크립트보다 유용하고 정확하지 않으므로 블록을 피해야합니다. 포함 일본어 텍스트에 관련된 블록의 다양한있다 \p{InHiragana}, \p{InKatakana}, \p{InCJK_Unified_Ideographs}, \p{InCJK_Symbols_and_Punctuation}

자바와 파이썬 모두 FFFF 어떤 네 자리 headecimal 번호입니다 \uFFFF를 사용하여 개별 코드 포인트를 참조 할 수 있습니다. Java 7은 Basic Multilingual Plane을 넘어선 Unicode 코드 포인트를 포함하여 모든 유니 코드 코드 포인트를 참조 할 수 있습니다. \x{10FFFF}. 파이썬 정규 표현식은 21 비트 유니 코드를 지원하지 않지만 파이썬 문자열은 그렇습니다. 따라서 정규 표현식에 코드 포인트를 삽입 할 수 있습니다. \U0010FFFF (대문자 U과 그 뒤의 8 자리 16 진수).

자바 7 (?U) 또는 UNICODE_CHARACTER_CLASS 플래그가 \w\d 같은 문자 클래스 shorthands 유니 코드를 인식하게, 그래서 그들은 등 일본어 표의 문자와 일치합니다 (그러나 \d 여전히 一二 같은 번호를 한자 일치하지 않습니다 三四) . 파이썬 3은 기본적으로 속기 클래스를 유니 코드로 인식합니다. Python 2에서 단축형 클래스는 re.UNICODE 또는 re.U 플래그를 사용할 때 유니 코드를 인식합니다.

모든 정규식 아이디어가 모든 스크립트에 똑같이 잘 적용되는 것은 아닙니다. 글자 상자와 같은 일부 내용은 일본어 텍스트와 관련이 없습니다.

+0

두 번째 단락은 Java 7 문서에 따라 올바르지 않을 가능성이 매우 높습니다. ** 시험을 보셨습니까? ** 나머지는 지금 시험 할 수 없습니다. – nhahtdh

+0

Python 버전 3 regex는 Java 7이 Pattern 클래스에서하는 것과 거의 같은 방식으로 유니 코드를 지원합니다. http://docs.python.org/py3k/library/re.html – nhahtdh

+0

@nhahtdh, 귀하의 의견은 도움이되지 않습니다. 예, Java는 유니 코드 스크립트 (두 번째 단락에 설명되어 있음)를 지원하며 "Is"접두사를 사용하지 않아도됩니다 ("Is"를 사용하지 않는 것이 좋습니다). 그리고 파이썬 3은 자바 (유니 코드 스크립트, 카테고리, 블록 등)와 마찬가지로 정규 표현식에서 유니 코드 기능을 거의 지원하지 않습니다. – slevithan

3

Java 문자 클래스는 사용자가 찾고있는 것과 유사합니다. 그들은 \ p here으로 시작하는 것들입니다.

+0

@nhahtdh : 특히 시도해 볼만한 것에 대해 질문하십시오. – Ashe

+0

나는이 코드를 실행할 때 내가 왜 false가되는지 알아 냈다 : 내 컴퓨터에서 http://ideone.com/p3P9b. 컴파일 명령은 제대로 작동하려면'javac -encoding utf8 '이어야합니다. – nhahtdh

6

파이썬

를 들어
#!/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') #=>カタカナ