2017-12-24 14 views
1

XSD의 패턴을 따르는 문자열을 생성하려고합니다.분음 부호, 아포스트로피, 악센트 등의 리터럴 문자를 사용하여 정규 표현식을 사용하는 문자를 제거하지 마십시오.

import java.lang.String; 

public class HelloWorld { 
    public static void main(String[] args) { 
     test("Führ"); 
    } 

    private static void test(String name) { 
     name = name.toUpperCase(); 
     name = name.replaceAll (
      "[^A-ZА-ЯΑ-ΩÄÀÁÂÃÅǍĄĂÆÇĆĈČĎĐÐÈÉÊËĚĘĜĢĞĤÌÍÎÏĴĶĹĻŁĽÑŃŇÖÒÓÔÕŐØŒŔŘẞŚŜŞŠȘŤŢÞȚÜÙÚÛŰŨŲŮŴÝŸŶŹŽŻ, '\\-–]", 
      "" 
     ); 
     System.out.println(name); 
    } 
} 

이 조각이 잘 실행하고 "FUHR"를 출력합니다 다음 XSD 패턴에 나타나지 않는 모든 문자를 제거하기 위해, 나는 다음과 같은 (문자 그대로 내 코드에서 복사 한 replaceAll 전화)를하고 있어요. 그러나 정확히 동일한 replaceAll 문을 사용하여 실행중인 환경에서 replaceAll 문자는 Ü 문자를 제거하고 데이터베이스에서 가져온 데이터 (즉 이름)가 FHR 인 것을 인쇄하고 코드에서와 같은 문자로 시작합니다 스 니펫 ("Führ").

내가 당황 스럽다. 무엇이 원인 일 수 있으며 어떻게 해결할 수 있습니까?


PS : 소스 파일의 인코딩은 UTF-8 (이클립스 .settings : encoding//<<<src-path>>>.java=UTF-8)이다 분음 부호 아포스트로피, 액센트 등으로 문자가 일치하는 경우 Apparantly 히

+0

LC_ALL = C로 설정해보십시오. –

+0

@ WiktorStribiżew 그건 유닉스 설정으로 보입니다 ... 나는 Windoze 환경에 상응하는 것을 찾으려고 노력할 것이다. –

+0

@ WiktorStribiżew'Locale.setDefault (Locale.ROOT);를 사용하여 시도했다; ... 변경하지 않는다. –

답변

1

, 하나 지정해야 유니 코드 단일 코드 포인트를 사용하는 문자.

예를 들어, à 문자의 경우 정규 표현식은 \u00E0이고 문자는 à이 아니어야합니다. 이유되며, 상기 캐릭터는 두 가지 방식으로 인코딩 될 수 있음 :

  • 단일 코드 점과 문자 (문자 적 A)
  • 이중 부호 점과 문자 (a 다음에 악센트`)

유니 코드 코드 포인트 \u00E0을 정규 표현식에 지정하면 à의 두 인코딩과 일치합니다. 정규식의 문자 à를 지정하면 해당 문자 코드 조각으로 인코딩되는 방식을 일치하고,이 두 코드 포인트로 인코딩 된 경우, 동일한 문자의 단일 코드 포인트 버전과 일치하지 않습니다.

유니 코드 단일 코드 점을 사용하여 정규식을 다시 작성하면 문제가 해결되었습니다. 질문 에서처럼 Ü 문자의 경우 정규식은 \u00DC으로 지정해야합니다. 이것은 Ü의 단일 코드 점 및 이중 코드 점 인코딩과 일치합니다.

해결책을 찾은 정보는 여기 Regex Tutorial - Unicode Characters and Properties (단락 : 특정 코드 포인트 일치)입니다.

관련 문제