Scala 文字列の処理
[履歴] [最終更新] (2016/02/13 16:53:01)

書式指定

object Main {
  def main(args: Array[String]): Unit = {
    println("%d + %d = %d".format(1, 1, 2)) //=> 1 + 1 = 2
  }
}

文字列の比較

Scala の型に関する知識』をご参照ください。

ヒアドキュメント

他の言語でいう「ヒアドキュメント」のようなものは """ で囲うことで実現できます。

object Main {
  def main(args: Array[String]): Unit = {
    println(""""ダブルクォーテーション" を含められる。""")
    println("""改行が
できる。""")
    println("""|インデントを
               |調整できる。""".stripMargin)
  }
}

文字列の連結

文字列の連結が頻繁に発生すると String インスタンスの生成コストが無視できなくなります。そのような場合は StringBuilder を用いて、最後に String に変換します。

object Main {
  def main(args: Array[String]): Unit = {
    println("文字列" + "の" + "連結")
    val sb = new StringBuilder
    for(i <- 0 to 10)
      sb.append("「%d回目の連結」".format(i))
    println(sb.toString)
  }
}

文字列分割

object Main {
  def main(args: Array[String]): Unit = {

    val arr: Array[String] = "abc,xyz,ABC".split(",")
    println(arr(0)) //=> abc
    println(arr(1)) //=> xyz
    println(arr(2)) //=> ABC

    val arr2: Array[String] = """[,/]\s*""".r.split("abc, xyz/ABC") // "文字列".r => scala.util.matching.Regex
    println(arr2(0)) //=> abc
    println(arr2(1)) //=> xyz
    println(arr2(2)) //=> ABC

    val regex = """(\d{4})/(\d{2})/(\d{2})""".r
    val regex(year, month, day) = "2015/01/01"
    println(year) //=> 2015
    println(month) //=> 01
    println(day) //=> 01
  }
}

改行文字で分割

object Main {
  def main(args: Array[String]): Unit = {
    val myLines = "line1\nline2\nline3\n"
    var cnt = 0
    myLines.lines.foreach { line =>
      println(line) // 改行コードを含まない
      cnt = cnt + 1
    }
    println(cnt) //=> 3
    myLines.linesWithSeparators.foreach { line =>
      print(line) // 改行コードを含む
      cnt = cnt + 1
    }
    println(cnt) //=> 6
  }
}

プリミティブ型に変換

object Main {
  def main(args: Array[String]): Unit = {
    val b: Boolean = "true".toBoolean
    val i: Int = "1".toInt
    val l: Long = "1".toLong
    val d: Double = "1.0".toDouble
  }
}

正規表現

object Main {
  def main(args: Array[String]): Unit = {

    // 一致するかどうかを判定
    val pattern = """^\d{4}/\d{2}/\d{2}$"""
    println("2016/12/31".matches(pattern)) //=> true
    println("2016-12-31".matches(pattern)) //=> false

    // 一致した箇所をリスト化
    val regex = """\d+""".r
    // val regex = new scala.util.matching.Regex("""\d+""") // としても同じ
    regex.findAllIn("1999/01/01").foreach { str =>
      // 三回ループ
      println(str) //=> 1999 => 01 => 01
    }
    val list: List[String] = regex.findAllIn("1999/01/01").toList
    println(list) //=> List(1999, 01, 01)

    // 一致した箇所をリスト化 (複数箇所の一致)
    val regex2 = """(\d{4})/(\d{2})/(\d{2})""".r
    regex2.findAllIn("1999/01/01 + 2015/01/01").matchData.foreach { m: scala.util.matching.Regex.Match =>
      // 二回ループ
      //=> 1999/01/01 -> 1999-01-01
      //=> 2015/01/01 -> 2015-01-01
      println("%s -> %s-%s-%s".format(m.group(0), m.group(1), m.group(2), m.group(3)))
    }
    val regex3 = new scala.util.matching.Regex("""(\d{4})/(\d{2})/(\d{2})""", "year", "month", "day") // ラベル付け
    regex3.findAllIn("1999/01/01 + 2015/01/01").matchData.foreach { m: scala.util.matching.Regex.Match =>
      println("%s -> %s-%s-%s".format(m, m.group("year"), m.group("month"), m.group("day")))
    }

    // 一致した箇所を置換
    println("1999/01/01".replaceAll("""\d""", "0")) //=> 0000/00/00
    println("""\d+""".r.replaceAllIn("1999/01/01", {
      m: scala.util.matching.Regex.Match => (m.group(0).toInt * 2).toString
    })) //=> 3998/2/2
  }
}
関連ページ
    概要 Scala は JVM 上で動作するバイトコードにコンパイルできる言語です。JAVA よりも柔軟な記述ができます。事前にこちらからダウンロードおよびインストールしておいてください。基本的な文法をまとめます。 変数および定数 詳細は『Scala の型に関する知識』をご参照ください。 object HelloWorld { def main(args: Array[String]):