web-dev-qa-db-ja.com

Java MessageFormatの中括弧をエスケープできますか?

Java MessageFormatで中括弧を出力したい。例えば、以下が機能しないことを知っている:

MessageFormat.format("  public {0} get{1}() {return {2};}\n\n", type, upperCamel, lowerCamel);

「return {2}」を囲む中括弧をエスケープする方法はありますか?

61
Steve Bosman

それらを単一引用符で囲むことができます。

'{'return {2};'}'

詳細については、 here を参照してください。

91
Brian Agnew

ワオ。驚き! MessageFormat のドキュメントは答えを知っています:

String内で、"''"は一重引用符を表します。 QuotedStringには、単一引用符を除く任意の文字を含めることができます。周囲の単一引用符は削除されます。 UnquotedStringには、単一引用符と左中括弧を除く任意の文字を含めることができます。したがって、フォーマットされたメッセージ"'{0}'"をもたらすはずの文字列は、"'''{'0}''"または"'''{0}'''"として記述できます。

16
Bombe

単一引用符を使用します。

MessageFormat.format("  public {0} get{1}() '{'return {2};'}'\n\n",
                     type, upperCamel, lowerCamel);

実際に一重引用符を使用したい場合、二重引用符で囲みます。 MessageFormatのJavaDoc は、このやや複雑な例を示しています。

したがって、フォーマットされたメッセージ"'{0}'"をもたらすはずの文字列は、"'''{'0}''" or "'''{0}'''"と書くことができます。

これは、単一引用符の場合は''、エスケープされたブレースの場合は'{'、閉じ括弧の場合は0'}'、閉じ引用符の場合は''です。

12
Jon Skeet
System.out.println(MessageFormat.format("I want to see ticks and curly braces around '''{'{0}'}'''", "this"));
2

この正規表現をpearlまたは他の言語で使用して、中括弧と一重引用符(x27)をエスケープできます。プレースホルダーには触れません。 _{0}_:bash echo "# 'single' quote test \n\n public {0} get{1}() {return {2};}\n\n" | Perl -pe 's/\x27/\x27\x27/g; s/\{([^0-9])/\x27\{\x27$1/g; s/([^0-9])\}/$1\x27\}\x27/g'