2011-01-20 6 views
0

RegEx flavor : wxRegEx in C++. 내가 일치 할 필요는 문자열의ASCII 정규식 패턴에서 유니 코드 문자를 나타내는 방법은 무엇입니까?

하나는 같은 문자가 포함 된 '...'(U + 2026, 수평 생략 부호) '»'(U + 00BB 이맥스에 붙여 넣을 때 205 \ 로 변환 , Right-Pointing Double Angle Quotation Mark). » (Emacs에 붙여 넣을 때) (ASCII 소스 코드 모드). 모두 아무 소용이 205 \ 및 \\ 205 내가 표현하는 시도 정규식 패턴 자체에서

'을 ...'.

이 문제를 해결하는 올바른 방법은 무엇입니까?

업데이트 : 당신이 \ uwxyz를 사용하는 유니 코드 문자를 표현하는 wxRegEx 문서 상태 유니 코드 문자 U + 로컬 바이트 순서에 WXYZ (wxyz는 정확히 네 개의 16 진수입니다.)

나는 그것을 시험해 보았지만, 어떤 이유로 그것이 나를 위해 (아직) 작동하지 않는다.

+1

C++을 사용하는 경우 [ICU regex library] (http://userguide.icu-project.org/strings/regexp)를 적극 권장합니다. 답안에서 설명하는 방식으로 상징적 인 이름을 사용할 수 있습니다. 아마도 PCRE를 사용할 수도 있지만 C++이 아닌 C의 PCRE 만 사용했습니다. – tchrist

+0

@tchrist : 다시 한번, 당신은 믿을 수 없을만큼 유용한 팁을 제공합니다. 고맙습니다! 나는이 권고를 장기간에 걸쳐 명확히 따르 겠지만, 지금은 내장 된 wxRegEx 라이브러리를 사용하여 얻을 필요가있다. –

답변

1

언어에 따라 다릅니다. 여러 언어가 아닌 ASCII를 탈출 할 필요 없다, 그러나 당신은 소스를 인코딩하기에 어떤 컴파일러에게 할 수 있습니다 예를 들면 다음과 같습니다.

$ java -encoding UTF-8 SomeThing.java 

또는

$ perl -Mutf8 somescript 

비록 펄 같은 것들로 , Python 및 Ruby를 사용하면 선언문을 파일에 넣을 수 있으며 ASCII와 상위 호환이 가능합니다. 예를 들어 :

을 할 수있는 가장 쉬운 방법은, 그리고 내가보기 엔 추천
#!/usr/bin/perl 

use utf8; 
use strict; 
use warnings; 
use autodie; 

my $s = "Où se trouve mon élève?"; 

if ($s =~ /élève/) { ... } 

# although of course this also works fine: 

while ($s =~ /\b(\w+)\b/g) { 
    print "Found <$1>\n"; 
} 

: 그냥 진짜 UTF-8 소스 코드의 문자를 넣어. 탈출구를 찾아야 만한다면, 훨씬 편리하지 않습니다.

이스케이프를 사용하려는 경우 글자 그대로 ASCII가 아닌 문자를 지정하는 방법은 언어에 따라 다릅니다. 자바에서는 \uXXXX를 통해 asquerous 자바 프리 프로세서를 사용할 수 있습니다

String s = "e\u0301le\u0300ve"; 

을 나는 그런 식으로하지 않는 것이 좋습니다 있지만. 두 번째 메커니즘은 그것이 자바 전처리 후 무엇인지 알아 내려고 노력에서 당신을 여분

String s = "e\\u0301le\\u0300ve"; 

그건 : 그것은 패턴에 사용되는 것, 당신은 같은 시간에 보간, 깨끗하고 지저분를 지연시킬 수 있습니다 (\u0022을 사용할 수는 없지만 \\0022을 사용할 수는 있지만) Pattern.CANON_EQ 플래그를 고정시킵니다.

대부분의 다른 언어는 자바를 사용하는 좀 더 간단한 방법을 사용합니다. 소스로 java -encoding UTF-8을 사용하지 않으면 못생긴 UTF-16을 사용합니다. UTF-16 대리인을 하드 코딩하는 것은 완전히 바보입니다. 하지마!!

펄에서 당신은 사용할 수 있습니다

my $s = "e\x{301}le\x{300}ve"; # NFD form 
my $s = "\xE9l\xE8ve";   # NFC form 

하지만 당신은 상징적으로 그 이름을 지정할 수 있습니다

당신이 선호하는 원하는 경우 마지막 하나를 짧게 할 수
use charnames qw<:full>; 
my $s_as_NFD = "e\N{COMBINING ACUTE ACCENT}le\N{COMBINING GRAVE ACCENT}e"; 
my $s_as_NFC = "\N{LATIN SMALL LETTER E WITH ACUTE}l\N{LATIN SMALL LETTER E WITH GRAVE}ve"; 

:

use charnames qw< :full latin >; 
my $s_as_NFC = "\N{e WITH ACUTE}l\N{e WITH GRAVE}ve"; 

이 모든 것들이 코드에 하드 코딩 된 매직 넘버보다 훨씬 뛰어납니다.

이 모든 것은 사용자 언어가 유니 코드를 지원한다고 가정하지만 많은 사용자는이를 지원하지 않습니다.

+0

이것은 엄청난 대답입니다. C++ 프로그램과 컴파일러에서 소스 코드에 비 ASCII 문자가 있으면 문제가 해결되면이를 받아 들일 것입니다. 그래서, 당신은 훨씬 덜 편리한 방법을 제공하는 것이 옳습니다. wxRegEx는 유니 코드 문자 (\ u2026)를 표현하는 방법을 제공하지만 어떤 이유로 든 (아직) 나에게는 적합하지 않습니다. 나는 다시 뭔가를 놓칠지도 모른다. –

+0

@Regex, 두 개의 백 슬래시로''\\ u2026 "'을 시도하십시오. – tchrist

+0

두 개의 백 슬래시도 시도했습니다. 일치하지 않습니다. "\ u2026"을 "."로 바꿀 때 경기가 있습니다 (당연히). 제가 놓친 다른 것이있을 수 있습니다. 필자는 테스트를 위해 대화 형 콘솔 샘플 프로그램을 사용하고 있습니다 (소스 코드의 재 컴파일을 피하기 위해). –

관련 문제