2017-05-25 7 views
0

の近くに不正な文字の範囲[^ \ u0009 \ u000A \ u000D \ u0020- \ uD7FF \ uE000- \ uFFFD \ uD800 \ uDC00- \ uDBFF \ uDFFF]java.util.regex.PatternSyntaxException:インデックス71

不正な文字範囲例外を示す上記の行。誰でも助けてくれますか?

上記の行をJavaコードで直接使用すると、エラーは表示されません。

Pattern xmlInvalidChars = Pattern.compile("[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\uDC00-\uDBFF\uDFFF]"); 

ただし、構成XMLファイルから文字列を取得してJavaコードで使用すると、エラーが表示されます。

String chars = ConfigLoader.getInstance().getInvalidCharacters(); 
Pattern xmlInvalidChars = Pattern.compile(chars); 
+1

問題は '\ uDC00- \ uDBFF'であり、この範囲は異常です。パターンとの一致には何が必要ですか?障害のある範囲を削除するには、ハイフンを削除する必要がありますか?また、XMLには単一のバックスラッシュが必要です。 –

+0

@WiktorStribiżewが言っているように、https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – Simon

答えて

0

設定XMLファイルでは、以下の行を使用しました。

[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\\uDC00-\\uDBFF\uDFFF] 

私はその逆の場合を使用しています。私はシングルスラッシュを二重スラッシュ(\ to \)に変更し、ダブルスラッシュをシングルスラッシュ(\ to)に変更しました。それは今働いている。

1

私はまだコメントできませんので、回答として投稿します。あなたの紐の内側にはゆったりしたバックスラッシュ\uD800\uDC00-\uDBFF\uDFFFがあるので、\uをエスケープ文字として扱いますが、そうではありません。正規表現の残りの部分に二重バックスラッシュを追加するだけです。


編集:パターンをコンパイルする前に、単一スラッシュを二重スラッシュに置き換えてみてください。

chars = chars.replace("\\","\\\\"); 
+0

を参照してください。実際にはこのパターンを使用して、着信XMLに存在しない無効な文字をまとめていますCDATAのファイル。しかし、この解決策は動作していません... – Gopinath

+0

うん、それはファイルからリテラル文字列をロードしている可能性がありますか? xmlファイル内の単一のスラッシュを二重バックスラッシュに置き換えることができます。またはjava内で置き換えてみてください。それに応じて私の答えを編集する。 –

関連する問題