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 仓库 找到。


原始标题:Introduction to Strings in Scala