Groovy の文字列リテラル
基本的な処理が簡単に書けること、Ant との連携が便利なこと、必要なら Java のライブラリを使い放題であることが気に入って、最近は時々 Groovy でスクリプトを書くことが増えてきました。Groovy の書籍としては、魅力や特徴が分かり易く書かれていて楽しく読める Groovy インアクション がイチオシですが、言語仕様を確認したりリファレンス的に使うタイプの本ではありません。
Groovy はマイナー言語だけあって Web でも日本語の情報が少ないので、気が向いたらメモを書き残していこうかと思います。手始めに今日は文字列リテラルの仕様をまとめておこうと思います。
Groovy の文字列リテラルにはは以下の 3 つの点が異なる、5 種類の文字列リテラルが定義されています。
- 文字列中の変数展開 (GString) が有効かどうか
- 単一行か複数行かどうか
- バックスラッシュ(エスケープ)の取り扱い
| 種類 | デリミタ | GString | エスケープ |
| 'シングルクォート文字列リテラル' | ' | 無効 | 有効 |
| "ダブルクォート文字列リテラル" | " | 有効 | 有効 |
| '''シングルクォート複数行文字列リテラル''' | ''' | 無効 | 有効 |
| """ダブルクォート複数行文字列リテラル""" | """ | 有効 | 有効 |
| /スラッシュ文字列リテラル/ | / | 無効 | \/ のみ |
変数展開 (GString) については単に $varname や ${varname} だけではなく、${任意の式} が展開されます。
GString では文字通り任意の式が埋め込み可能であり、配列アクセス、プロパティアクセスはもちろん、計算式や関数呼び出し、三項演算子による条件分岐など何でも使えます。デリミタ文字列(引用符)も GString 中ではエスケープせず普通に書けます。
println "browser: ${Math.random() < 0.25 ? "Firefox" : "other"}"
複数行文字列リテラルは複数行文字列に使用する以外にも、HTML タグなどシングルクォートやダブルクォートが頻出する文字列を扱うときにも便利です (3 連続でない限り引用符もエスケープ不要)。
スラッシュ文字列リテラルでは、その終端文字 "/" をエスケープする場合の "\/" 以外の "\" はエスケープシーケンスとして解釈されないため、正規表現など "\" が頻出する文字列を扱うときに便利です。
バックスラッシュによるエスケープについて勘違いしてはならないのは、\uXXXX 形式のエスケープは(Java 同様に) 構文解析に先立ち字句解析の時点で行われるもので、文字列リテラル中のエスケープと同列ではないということ。文字列中はもちろん、引用符などの特殊記号に対しても利用できます。
a = 'replaced' assert 'a' == /\u0061/ // U+0061 は a assert '/' == /\// assert '\\replaced' == /\$a/ assert 'replaced' == /$\u0061/ assert 'replaced' == /\u0024a/ // U+0024 は $ assert 'replaced' == "\u0024a" assert '\t' == "\u005ct" // U+005c は \ assert 'a' == \u0022a" // U+0022 は " assert 'a' == \u002Fa/ // U+0022 は /
ま、基本的には最初に書いた表がすべてです。難しい話じゃありません。\uXXXX について 誤りあるいは理解不能な説明がされてしまっている のは