1. 概述
在本教程中,我们将深入探讨 Scala 中的 字符串(String) 类型。虽然字符串是编程中最基础的数据类型之一,但在 Scala 中,它具备了更多面向函数式编程和集合操作的特性。
2. 定义字符串
在 Scala 中,字符串可以分为两种形式:
✅ 单行字符串:使用双引号包裹
val singleLineString = "Hello, I am a single line string"
✅ 多行字符串:使用三重双引号包裹,并结合 .stripMargin
方法进行格式美化
val multiLineString = """Hello, I am
|a multiline
|String""".stripMargin
其中 |
是默认的边界符号,.stripMargin
可以自动去除每行前的空白并左对齐文本内容,使输出更整洁。
3. 字符串相等性比较
在 Scala 中,推荐使用 ==
进行字符串比较,而不是 Java 那样的 .equals()
。这是因为 Scala 的 ==
已经处理了 null 值安全的问题。
assert("Hello, I am a single line string" == singleLineString)
⚠️ 注意:这与 Java 的 ==
不同,Java 中 ==
比较的是引用,而 Scala 的 ==
实际上调用的是 equals
方法。
4. 字符串拼接
字符串拼接有两种常见方式:
✅ 使用 +
操作符(最常用)
val askTheTimeString = "...What time is it?"
val concatStr = singleLineString + askTheTimeString
assert(concatStr == "Hello, I am a single line string...What time is it?")
✅ 或者使用 concat
方法
val concatStrWithConcat = singleLineString.concat(askTheTimeString)
assert(concatStrWithConcat == "Hello, I am a single line string...What time is it?")
5. 正则表达式匹配
Scala 提供了对正则表达式的支持,通过 scala.util.matching.Regex
类实现。
5.1 简单匹配
将字符串转换为 Regex 实例的方式很简单,只需要在字符串后面调用 .r
:
val testString = "this is a string with numbers 123456"
val regEx: Regex = "^(?=.*[a-zA-Z])(?=.*[0-9])".r
val result = regEx
.findFirstMatchIn(testString)
.isDefined
assertTrue(result == true)
这段代码检查字符串是否同时包含字母和数字。
5.2 分组匹配
我们还可以使用括号来定义捕获组:
val testString = """property1: value1
|property2: value2
|property""".stripMargin
定义一个带有两个捕获组的正则表达式:
val regExGroup = "([0-9a-zA-Z- ]+): ([0-9a-zA-Z-#()/. ]+)".r
val matchResults = regExGroup.findAllMatchIn(testString)
然后提取出键值对信息:
val matchedStrings = matchResults
.map(regExMatch =>
s"key: ${regExMatch.group(1)} value: ${regExMatch.group(2)}"
).mkString(System.lineSeparator)
val expected = """key: property1 value: value1
|key: property2 value: value2""".stripMargin
assert(matchedStrings.equals(expected))
6. 字符串插值
Scala 提供了三种字符串插值方式:s
, f
, 和 raw
插值。
6.1 s 插值(最常用)
允许直接在字符串中插入变量:
val age = 30
val agePresentation = s"I am $age"
assert("I am 30" == agePresentation)
6.2 f 插值(类型安全)
支持格式化输出,类似 C 语言中的 printf:
val name = "Michele"
val height = 1.70
val interpStr = f"My name is $name%s. I am $age%d years old and $height%1.2f meters tall"
assert(interpStr == "My name is Michele. I am 30 years old and 1.70 meters tall")
6.3 raw 插值(不转义)
不会对特殊字符如 \n
做转义处理:
val result = raw"My name is $name%s. \n $agePresentation and $height%1.2f meters tall"
assert(result == "My name is Michele%s. \\n I am 30 and 1.7%1.2f meters tall")
7. 总结
本文介绍了 Scala 中字符串的一些核心操作:
- ✅ 单行与多行字符串定义
- ✅ 字符串比较(null 安全)
- ✅ 字符串拼接方法
- ✅ 正则表达式的使用与分组匹配
- ✅ 三种字符串插值方式及其应用场景
这些功能虽然基础,但在实际开发中非常实用,尤其是在构建 DSL 或处理配置文件时。完整示例代码可以在 GitHub 仓库 找到。