2011-01-20 17 views
0

RegEx flavor:wxRegEx in C++。ASCII正規表現パターンでUnicode文字を表現する方法は?

私は一致する必要がある文字列の一つは、Emacsのに貼り付けたときに205 \ に変換 '...'(U + 2026、水平方向の反復記号)のような文字が含まれていると「» '(U + 00BB 、Right-Pointing Double Angle Quotation Mark)。»のままで、Emacs(ASCIIソースコードモード)に貼り付けられます。両方無駄に 205 \\ 205 \ととして、私が表現しようとした正規表現パターンそのもので

'を...'。

この問題にどのようにアプローチすればよいでしょうか?

更新:あなたは\ uwxyzを使用してUnicode文字を表現するwxRegExドキュメント状態Unicode文字U +ローカルのバイト順序でWXYZ(WXYZは正確に4桁の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 

が、Perlのようなもので、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を象徴的に指定する方法も言語によって異なります。 Javaでは、あなたは\uXXXX経由asquerousのJavaプリプロセッサを使用することができます。

String s = "e\u0301le\u0300ve"; 

私はそのようにお勧めしませんが。第二のメカニズムは、それがJavaプリプロセッサの後にあるかを把握しようとするからあなたを惜しみ

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

こと:それはパターンで使用するために起こっている場合は、同時に補間、きれいで、メシエを遅らせることができます(\u0022は使用できませんが、\\0022を使用することはできません)、Pattern.CANON_EQフラグを無効にします。

他のほとんどの言語では、そのJavaをより簡単に行うことができます。あなたのソースにjava -encoding UTF-8を使用しない限り、醜いUTF-16を主張します。 UTF-16代理人をハードコーディングすることは絶対にばかげています。それをしません!!

Perlでは、あなたは使用することができます

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

いますが、象徴的にそれらに名前を付けることができ

あなたが好む場合は、最後の1ははるかに短くすることができる
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"; 

これらはすべて、コード内のハードコードマジックナンバーよりも無限に優れています。

これはあなたの言語がUnicodeをサポートしていることを前提としていますが、多くはそうしていないことを前提としています。

+0

これは信じられないほどの答えです。私はC++プログラムとソースコードに存在するものがあれば非ASCII文字について不平を言っているコンパイラにある私の特定の問題を解決したらそれを受け入れるつもりです。したがって、はるかに簡便な方法を提供することは正しいです。 wxRegExはUnicode文字(\ u2026)を表現する方法を提供しますが、何らかの理由で(まだ)私にとってはうまくいきません。私は再び何かが欠けているかもしれない。 –

+0

@Regex、2つのバックスラッシュで '' \\ u2026 "'を試してください。 – tchrist

+0

2つのバックスラッシュも試しました。勝ち目がない。 "\ u2026"を "。"に置き換えるとマッチがある(もちろん)。私が紛失しているものが他にもあるかもしれません。私はテストのために対話型のコンソールサンプルプログラムを使用しています(ソースコードの再コンパイルを避けるため)。 –