0

XML 仕様によると、次の文字のみが有効です。

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

fooオブジェクトの JSON 表現を含む名前の文字列があります。JSON オブジェクトの一部の文字列には、XML では無効な文字のエスケープ シーケンスが含まれてい\u0002ます\u000b

fooJSON から XML へのコンバーターにスローする前に、これらのエスケープ シーケンスを削除したいと考えています。コンバーターは、これらの無効な文字を処理する機能を提供しないブラック ボックスであるためです。

私がやりたいことの例:

MAGIC_REGEX = "<here's what needs to be found>"  # TODO

String foo = "\\u0002bar b\\u000baz qu\\u000fx"
String clean_foo = foo.replace(MAGIC_REGEX, "�")  # � Unicode replacement character

System.out.println(clean_foo)  # Output is "bar baz qux"

どうすればそれを達成できますか?文字列を解析して Unicode コードポイントを比較する代わりに正規表現を使用するソリューションのボーナス ポイント。

私はこの SO questionを認識しています。ただし、ここでの問題は、実際の文字自体ではなく、不正な文字のエスケープ シーケンスです。

4

1 に答える 1

1

私は最終的にこの正規表現を思いつきました。これは、XML 仕様に従って、上記#x10000(#x11000およびそれ以降)を除く、ほぼすべての不正な文字に一致します。

# case-sensitive version
\\\\u(00(0[^9ADad]|1[0-9A-Fa-f])|D[8-9A-Fa-f][0-9A-Fa-f]{2}|[Ff]{3}[EFef])

# case-insensitive version
\\\\u(00(0[^9ad]|1[0-9a-f])|D[8-9a-f][0-9a-f]{2}|fff[ef])
于 2013-09-10T15:39:49.167 に答える