[毎日Kotlin] Day6.Strings(テンプレート)

2018.01.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

毎日Kotlinシリーズです。

このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO

問題

Strings | Try Kotlin

テンプレートを使って正規表現を書いてみよう!

Read about different string literals and string templates in Kotlin.

Raw strings are useful for writing regex patterns, you don't need to escape a backslash by a backslash. Below there is a pattern that matches a date in format 13.06.1992 (two digits, a dot, two digits, a dot, four digits):

fun getPattern() = """\d{2}\.\d{2}\.\d{4}"""

Using month variable rewrite this pattern in such a way that it matches the date in format 13 JUN 1992 (two digits, a whitespace, a month abbreviation, a whitespace, four digits).

val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"

fun getPattern(): String = TODO()

狙い

ここで考えて欲しい問題の意図はなんだろうか?

Javaになかったテンプレート機能が追加されました。文字列の結合や変数をいれるときにいちいち+で結合StringBuilderなど使う必要がなくなったのです。便利。便利すぎる!

とにかく、テンプレートを体感せよ

正規表現の"""でくくるやり方もテンプレート機能です。テンプレート使わない方法もやってみよう。

解答例

fun getPattern(): String = """\d{2} $month \d{4}"""

テンプレートを使わない例

fun getPattern(): String = "\\d{2} ${month} \\d{4}"

\をエスケープしないといけないので、正規表現だけを書くことができません。面倒です。

Javaの例

同じようなことをすると、+で結合\をエスケープする必要があります。

public class Main {
    private static final String month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)";

    public static String getPattern() {
        return "\\d{2} " + month + " \\d{4}";
    }

    public static void main(String[] args) {
        System.out.println("11 MAR 1952".matches(getPattern()));
        System.out.println("24 AUG 1957".matches(getPattern()));
        System.out.println("24 RRR 1957".matches(getPattern()));
    }
}

あとがき

今回は正規表現の例でテンプレートを使用しましたが、単純に文字列結合のテンプレートもあります。

    val name = "kamedon"
    print("Hello $name! ")

+で結合しないといけなかったのが、$変数名で同じことができるのですごい楽になりました。

どんどんテンプレート使っていこう!

Day7.でまたお会いしましょう。