字符串 #

一、字符串基础 #

1.1 创建字符串 #

scala
val greeting = "Hello, Scala!"
val empty = ""
val singleChar = "A"

1.2 字符串是不可变的 #

scala
val str = "Hello"
val newStr = str + " World"
println(str)
println(newStr)

1.3 字符串连接 #

scala
val firstName = "John"
val lastName = "Doe"

val fullName1 = firstName + " " + lastName
val fullName2 = s"$firstName $lastName"
val fullName3 = firstName.concat(" ").concat(lastName)

二、字符串插值 #

2.1 s 插值器 #

最常用的插值器,支持变量和表达式:

scala
val name = "Scala"
val version = 3

val greeting = s"Hello, $name!"
val info = s"Scala $version is great!"
val expr = s"2 + 2 = ${2 + 2}"
val method = s"Name length: ${name.length}"

2.2 f 插值器 #

格式化字符串,类似 printf:

scala
val price = 99.99
val quantity = 10

val formatted = f"Price: $$${price}%.2f"
val percentage = f"Progress: ${33.333}%.1f%%"
val padded = f"${42}%05d"

常用格式说明符:

说明符 描述 示例
%d 整数 f"${42}%d"
%f 浮点数 f"${3.14}%.2f"
%s 字符串 f"${“hello”}%s"
%x 十六进制 f"${255}%x"
%o 八进制 f"${8}%o"
%e 科学计数法 f"${1000.0}%e"

2.3 raw 插值器 #

不转义特殊字符:

scala
val escaped = "Hello\nWorld"
val rawStr = raw"Hello\nWorld"

println(escaped)
println(rawStr)

2.4 多行插值 #

scala
val name = "Scala"
val multiline = s"""Welcome to $name!
                    |This is a multiline string.
                    |Enjoy coding!""".stripMargin

println(multiline)

三、多行字符串 #

3.1 创建多行字符串 #

scala
val text = """This is a
multiline string
in Scala"""

println(text)

3.2 使用 stripMargin #

scala
val formatted = """This is a
                  |multiline string
                  |with stripMargin""".stripMargin

println(formatted)

3.3 自定义边距字符 #

scala
val custom = """This is a
               #multiline string
               #with custom margin""".stripMargin('#')

println(custom)

3.4 保持缩进 #

scala
val indented = """This is a
                 |  indented
                 |    multiline string""".stripMargin

println(indented)

四、常用字符串方法 #

4.1 长度和访问 #

scala
val str = "Hello, Scala!"

str.length
str.size
str.isEmpty
str.nonEmpty

str.charAt(0)
str(0)
str.apply(0)

4.2 子字符串 #

scala
val str = "Hello, Scala!"

str.substring(7)
str.substring(0, 5)
str.take(5)
str.takeRight(6)
str.drop(7)
str.dropRight(8)

4.3 分割和连接 #

scala
val str = "apple,banana,cherry"

val parts = str.split(",")
val parts2 = str.split(", ", 2)

val joined = parts.mkString("-")
val joined2 = parts.mkString("[", ", ", "]")

4.4 大小写转换 #

scala
val str = "Hello, Scala!"

str.toLowerCase
str.toUpperCase
str.capitalize
str.toLowerCase.capitalize

4.5 去除空白 #

scala
val str = "  Hello, Scala!  "

str.trim
str.stripLeading
str.stripTrailing
str.stripPrefix("  ")
str.stripSuffix("  ")

4.6 替换 #

scala
val str = "Hello, Scala!"

str.replace("Scala", "World")
str.replaceFirst("l", "L")
str.replaceAll("[aeiou]", "*")

4.7 查找 #

scala
val str = "Hello, Scala!"

str.indexOf('l')
str.indexOf("Scala")
str.lastIndexOf('l')
str.contains("Scala")
str.startsWith("Hello")
str.endsWith("!")

4.8 比较 #

scala
val str1 = "apple"
val str2 = "banana"
val str3 = "Apple"

str1.compareTo(str2)
str1.compareToIgnoreCase(str3)
str1.equals(str2)
str1.equalsIgnoreCase(str3)

五、字符串与集合 #

5.1 字符串转集合 #

scala
val str = "Hello"

str.toCharArray
str.toList
str.toSeq
str.toSet

5.2 字符串迭代 #

scala
val str = "Hello"

str.foreach(println)

for (c <- str) println(c)

str.map(_.toUpper)
str.filter(_.isLetter)
str.takeWhile(_ != 'l')

5.3 集合转字符串 #

scala
val list = List('H', 'e', 'l', 'l', 'o')

list.mkString
list.mkString("-")
list.toString

六、字符串构建 #

6.1 StringBuilder #

scala
val sb = new StringBuilder

sb.append("Hello")
sb.append(", ")
sb.append("Scala")
sb.append('!')

val result = sb.toString

6.2 StringBuilder 方法 #

scala
val sb = new StringBuilder("Hello")

sb.insert(5, " World")
sb.delete(5, 11)
sb.replace(0, 5, "Hi")
sb.reverse

sb.clear

6.3 使用集合操作构建 #

scala
val words = List("Hello", "World", "Scala")

val sentence = words.mkString(" ")
val csv = words.mkString(",")
val json = words.map(s => s""""$s"""").mkString("[", ", ", "]")

七、正则表达式 #

7.1 创建正则表达式 #

scala
import scala.util.matching.Regex

val pattern1 = "[0-9]+".r
val pattern2 = new Regex("[0-9]+")
val pattern3 = """\d+""".r

7.2 查找匹配 #

scala
val text = "123 Main Street, Apt 456"
val pattern = """\d+""".r

val firstMatch = pattern.findFirstIn(text)
val allMatches = pattern.findAllIn(text).toList
val matchIterator = pattern.findAllIn(text)

7.3 替换 #

scala
val text = "123 Main Street, Apt 456"
val pattern = """\d+""".r

val replaced1 = pattern.replaceAllIn(text, "XXX")
val replaced2 = pattern.replaceFirstIn(text, "XXX")

7.4 模式匹配 #

scala
val pattern = """(\d+)-(\d+)-(\d+)""".r
val text = "2024-03-27"

text match
  case pattern(year, month, day) =>
    println(s"Year: $year, Month: $month, Day: $day")
  case _ =>
    println("No match")

7.5 正则表达式组 #

scala
val pattern = """(\w+)@(\w+)\.(\w+)""".r
val text = "user@example.com"

pattern.findAllMatchIn(text).foreach { m =>
  println(s"Full: ${m.matched}")
  println(s"User: ${m.group(1)}")
  println(s"Domain: ${m.group(2)}")
  println(s"TLD: ${m.group(3)}")
}

八、字符串工具类 #

8.1 StringOps 方法 #

scala
val str = "Hello, Scala!"

str.reverse
str.sorted
str.distinct
str.grouped(3).toList
str.sliding(3).toList
str.padTo(20, '-')
str.patch(5, " WORLD", 7)

8.2 字符串对齐 #

scala
val str = "Scala"

str.padTo(10, ' ')
str.padTo(10, '-')

f"$str%-10s|"
f"$str%10s|"

8.3 字符串反转 #

scala
val str = "Scala"

str.reverse
str.reverseIterator.toList

九、字符串与数值转换 #

9.1 数值转字符串 #

scala
val num = 42

num.toString
num.toHexString
num.toBinaryString
num.toOctalString

f"$num%04d"
f"$num%x"

9.2 字符串转数值 #

scala
val intStr = "123"
val intVal = intStr.toInt
val intOption = intStr.toIntOption

val hexStr = "FF"
val hexVal = Integer.parseInt(hexStr, 16)

val binStr = "1010"
val binVal = Integer.parseInt(binStr, 2)

9.3 安全转换 #

scala
def safeParseInt(str: String): Option[Int] =
  scala.util.Try(str.toInt).toOption

safeParseInt("123")
safeParseInt("abc")

十、字符串最佳实践 #

10.1 使用字符串插值 #

scala
val name = "Scala"
val version = 3

val bad = "Hello, " + name + " " + version + "!"
val good = s"Hello, $name $version!"

10.2 使用多行字符串处理复杂文本 #

scala
val json = """{
  "name": "Scala",
  "version": 3,
  "features": ["FP", "OOP"]
}"""

10.3 使用 stripMargin 格式化 #

scala
val sql = """
  SELECT id, name, email
  FROM users
  WHERE status = 'active'
  ORDER BY created_at DESC
""".stripMargin

10.4 处理空字符串 #

scala
val str: String = null

val safe = Option(str).getOrElse("")
val safeUpper = Option(str).map(_.toUpperCase).getOrElse("")
val nonEmpty = Option(str).filter(_.nonEmpty)

十一、总结 #

字符串插值器对比 #

插值器 用途 示例
s 变量插值 s"Hello, $name"
f 格式化 f"$price%.2f"
raw 不转义 raw"a\nb"

常用方法速查 #

操作 方法
长度 length, size
访问 charAt, apply
子串 substring, take, drop
分割 split
连接 mkString
大小写 toLowerCase, toUpperCase
去空白 trim, strip
替换 replace, replaceAll
查找 indexOf, contains
比较 equals, compareTo

下一步,让我们学习 条件表达式

最后更新:2026-03-27