유니 코드 지원을위한 Java 정규식?


80

A와 Z를 일치시키기 위해 정규식을 사용합니다.

[A-Za-z]

정규식이 사용자가 입력 한 utf8 문자와 일치하도록 허용하는 방법은 무엇입니까? 예를 들어 环保 部와 같은 중국어 단어


2
Java 7에서 Unicode regex는 UNICODE_CHARACTER_CLASSflag 또는 embeddable로 지원됩니다 (?U). 참조 stackoverflow.com/questions/4304928/...
알라 매코맥

답변:


120

찾고있는 것은 유니 코드 속성입니다.

예 : \p{L}모든 언어의 모든 종류의 편지

따라서 이러한 중국어 단어와 일치하는 정규식은 다음과 같을 수 있습니다.

\p{L}+

이러한 속성이 많이 있습니다. 자세한 내용은 regular-expressions.info를 참조하십시오 .

또 다른 옵션은 수정자를 사용하는 것입니다.

Pattern.UNICODE_CHARACTER_CLASS

Java 7에는 Pattern.UNICODE_CHARACTER_CLASS미리 정의 된 문자 클래스의 유니 코드 버전을 활성화 하는 새로운 속성 이 있습니다. 자세한 내용과 링크는 여기 내 대답을 참조하십시오.

이런 식으로 할 수 있습니다

Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);

그리고 \w모든 언어에서 모든 문자와 모든 숫자와 일치 (물론 일부 단어의 결합 문자 싶습니다 _).


Da̱nx̱a̱laga̱litła̱n과 같은 단어를 일치 시키려면 패턴 일치기에 분음 부호를 결합하도록 지시해야합니까?
Dave Jarvis

9

개별 문자를 일치 시키려면 리터럴 또는 \u03FB구문을 통해 문자 클래스에 간단히 포함시킬 수 있습니다 .

분명히 표의 언어로 허용되는 모든 문자를 나열 할 수는 없습니다. 정규 표현식이 유니 코드 문자를 유형 또는 코드 블록에 따라 처리하도록하기 위해 여기 에 정의 된 다양한 다른 이스케이프가 지원 됩니다 . "유니 코드 지원"섹션, 특히 Character클래스와 유니 코드 표준 자체에 대한 참조를보십시오 .


방법 mataches에 대한 사용자의 예를环保部가 입력 한 여러 UTF8 문자, 사용자는 무작위로 문자의 수를 입력 할 수 있기 때문에
cometta

1
그냥 여러 라틴 문자와 일치 같다 : [a-z]+또는 [a-z]{3}심지어 [a-z]{2,10}. 유일한 차이점은 한정자가 적용되는 문자 클래스에서 허용하는 것입니다.
Kilian Foth

9

NLS 지원을 해결하고 영어 특수 문자를 허용하지 않으려면 아래 패턴을 사용할 수 있습니다.

[a-zA-Z0-9 \ u0080- \ u9fff] * +

UTF 코드 포인트 참조 : http://www.utf8-chartable.de/unicode-utf8-table.pl

코드 조각 :

    String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
    String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ";
    String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ";
    String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯";
    String engChinesStr = "ABC導字會";


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern
            .compile("[a-zA-Z0-9 \\u0c00-\\u0c7f]*+");
    System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels)
            .matches());


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern
            .compile("[a-zA-Z0-9 \\u4e00-\\u9fff]*+");

    Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern
            .compile("[a-zA-Z0-9 \\u0080-\\u9fff]*+");

    System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr)
            .matches());

3
  • Java 정규식 API는 char유형에서 작동합니다.
  • char유형은 암시 적으로 UTF-16
  • UTF-8 데이터가있는 경우 입력시 UTF-16으로 트랜스 코딩해야합니다 (아직 수행되지 않은 경우)

유니 코드는 범용 문자 집합이며 UTF-8은 모든 것을 설명 할 수 있습니다 (제어 문자, 구두점, 기호, 문자 등 포함). 포함 할 항목과 제외 할 항목에 대해 더 구체적이어야합니다. Java 정규식은 \p{category}구문을 사용하여 범주 별로 코드 포인트를 일치 시킵니다. 범주 목록유니 코드 표준 을 참조하십시오 .

표의 문자 시퀀스에서 단어를 식별하고 구분하려면보다 정교한 API를 살펴 봐야합니다. 나는 BreakIterator유형 부터 시작할 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.