[はじめようApache Groovy] #05 - Groovyの文字列

こんにちは!なるーらぼです。前回は数値をみてきましたが、今回はもっともよく利用するであろう「文字列」です!


Groovyにおける文字列

Groovyでは大きくわけて2種類の文字列オブジェクトがあります。ひとつはJavaの文字列、「java.lang.String」です。そしてもうひとつがGroovyで追加されている「GString」です。


GroovyにおけるJava文字列

GroovyにおいてはJavaの文字列と同等になるものは1種類です。それはシングルクォーテーションで囲んだものです。

def msg = 'this is java.lang.String'

文字列の結合もJavaと同じで「+」演算子を使います。ただ、このことはGStringであっても同じですが。1点、Javaの文字列から拡張されていることがあります。それが複数行テキストのサポートです。これを表現するにはシングルクォーテーション3つで囲むようになります。

def multiMsg = '''これは
複数行の
文字列です。

'''

また、エスケープ文字を利用することができるのはJavaと同じです。タブ文字であれば「\t」ですし、改行を表すのは「\n」です。


Groovyの文字列

さて、次はGroovyが独自に持っている文字列です。大きな特徴としてはRubyなどの文字列と同様に変数展開することができる点でしょう。変数を文字列に埋め込むときは変数名を「${}」で囲むか、変数名の先頭にドル記号「$」をつけます。そして、そのとき文字列はダブルクォーテーションで囲む必要があります。

def name = 'nalulabo'
def msg = "Hello, $name"
println msg

変数といいつつ、「${}」で囲めば式も埋め込むことができます

println "1たす2は${1+2}です。"

同様に、オブジェクトのメソッドやプロパティを利用するときには波括弧で囲んでください。例えば、次の例は「MissingPropertyException」例外が発生します。

def age = 37
println "年齢は$age.toString()です。"

このとき、「$age.toString()」部分は「${age.toString}()」と解釈されてしまいます。つまり、変数ageが表す数値オブジェクトの「toString」プロパティを参照しようとします。もちろん、そのようなプロパティはありませんので、例外が発生するということです。

なお、考えてみれば当たり前なのですが変数として埋め込みされた文字列は埋め込み後の文字列とは別のオブジェクトになります。ですから、以下のコードは失敗します。

def a = "aaa"
def b = "$a"
assert a.hashCode() == b.hashCode()

これはハッシュマップなどのキーとして変数埋め込みを行ってデータを登録することができますが、元のオブジェクトとはハッシュが異なるためです。このため、マップのキーにGStringによる変数展開を使ったときに探し出すことができなくなってしまうということがあります。

このほかに、ダブルクォーテーション3つで囲むとやはり複数行のテキストをつくることができます


正規表現用の文字列

正規表現でよくみられるスラッシュで囲まれた文字列もまた、GStringです。このときも変数展開することができます。さらに、複数行テキストも実現することができます。

def name = 'nalulabo'
def pattern = /.*$name.*/
def multiMsg = /これも

複数行

テキストです/

1点、注意しなければならないことがあります。スラッシュで囲む文字列では空文字を表現することができないというものです。なぜなら、書いてみてください。おわかりでしょう。

def aaa = //

これはスラッシュ2つ以降がコメントになります。Javaと構文がほぼ同じですので、これはコメントとして扱われてしまいます。さらに補足ですが、RubyやPythonのような気分で書いていくようになると、#記号を書いてコメントしたくなりますよね。しかし基本的にエラーになりますので「//」か「/* */」を使ってください。


ちょっとかわったGString

実はドル記号がエスケープ文字になる文字列が用意されています。ドル記号とスラッシュで囲まれた文字列です。

def msg = $/こんな文字列です
\nはそのままエスケープされずに
\nとして扱われます/$

よってJavaの文字列で可能なエスケープ文字はそのまま「\n」という文字列として扱われてしまいます。これが便利なケースもありますので用途に応じて使い分けをしましょう。


補足

もしもJavaのStringとして宣言した変数にGStringを代入するとどうなるのでしょう?たとえば、あるメソッドは引数にStringを要求していますが、ダブルクォーテーションで囲んだ変数展開ありの文字列を渡したとします。すると、Groovyは暗黙的に「toString()」メソッドを呼び出してJavaのStringにしてから渡します。考えてみれば当然のようにも思いますが、補足しておきます。


さらに、コメントも登場したのでそちらも補足しておきましょう。Groovyではコメントは4種類あります。

一つ目は「//」で記述する一行コメントです。

二つ目は「/*」ではじまって「*/」で終わる複数行コメントです。

三つ目は「/**」ではじまって「*/」で終わる複数行コメントで、GroovyDoc形式にすることができます。

四つ目はシャープ記号です。

さきほどシャープ記号は使うことができないようにお話ししましたが、例外的に1か所でだけ使うことができます。それはファイルの先頭行です。

これは「SheBang」と呼ばれるUnixではごく普通に使われるもので、どの実行形式を使ってスクリプトを実行するかを伝えるためのおまじないです。Groovyもスクリプトとして実行することができるため、先頭行に限ってはシャープ記号を記述することができます。

#!/usr/bin/env groovy
println "hello"


最後に

今回は文字列オブジェクトについてみてきました。

最もよく利用するものですし、データ操作では使わないわけにいかないものでしょう。

変数展開は便利ですので用途に応じて活用してみてください。

もんが(なるーらぼ)

個人でプログラミングの学習サイト「なるーらぼ」を運営しています。
https://nalu-labo.amebaownd.com
PowerShell入門の電子書籍2冊も出版しています。
http://www.amazon.co.jp/dp/B017LJOCJ2

なるーらぼ

忙しい非プログラマに贈るプログラミング学習サイトです。 3分動画を使ったPowerShellや要件定義の入門講座、パソコン活用のtipsを公開しています

0コメント

  • 1000 / 1000