2017-12-24 33 views
1

でリテラル文字を使用して失敗しました。 XSDのパターンで表示されない任意の文字を削除するには、私は次のことをやっている(文字通り私のコードからコピーreplaceAllコール):ストリップ文字私は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); 
    } 
} 

この断片は、正常に動作し、「FÜHR」を出力します。しかし、私はまったく同じreplaceAll文で、上の実行している環境では、replaceAll呼び出しがÜ文字を削除し、データベースから来て、コードと同じ文字で始まるデータとFHR(すなわち名前)出力しますスニペット( "Führ")。

私が原因である可能性がありますどのような...困惑だし、どのように私はこの問題を解決することができますか?


PS:ソースファイルのエンコーディングがUTF-8である(Eclipseの.settings:encoding//<<<src-path>>>.java=UTF-8

+0

LC_ALL = Cを設定してみてください。 –

+0

@WiktorStribiżewそれはUnixの設定に見えます...私はWindoze環境に相当するものを見つけようとします。 –

+0

@WiktorStribiżew 'Locale.setDefault(Locale.ROOT);' ...を使用しないで試しました。 –

答えて

1

Apparantly、特殊記号、アポストロフィ、アクセント等と文字に一致するとき、一方が指定する必要がありUnicode単一コードポイントを使用している文字。

たとえば、正規表現では\u00E0を指定し、リテラルではàを指定しないでください。 à文字の2つの方法で符号化することができることが理由であり、:

  • シングルコードポイントとしてà文字(リテラルA)
  • ダブルコードポイントとしてà文字( aに続いてアクセント) `)

ユニコードコードポイント\u00E0を正規表現に指定すると、両方のエンコードに一致します。正規表現リテラルàを指定すると、その文字だけがあなたのコードの断片でエンコードされた方法と一致します、そしてそれは、ダブルコードポイントとしてエンコードされている場合、それは同じ文字の単一のコード・ポイントのバージョンと一致しません。ユニコード単一のコードポイントを使用して正規表現を書き換え

は、問題を解決しました。疑問のようにÜ文字の場合、正規表現は\u00DCと指定する必要があります。これは、Üのシングルコードポイントとダブルコードポイントエンコーディングの両方に一致します。

解決策につながった情報は、Regex Tutorial - Unicode Characters and Properties(段落:特定のコードポイントの一致)でした。

関連する問題