字符串 #
一、字符串基础 #
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