正则表达式是用于模式匹配和字符串搜索的一种工具,Scala 中通过 scala.util.matching.Regex 类支持正则表达式。你可以使用正则表达式在字符串中执行查找、替换、验证等操作。Scala 中的正则表达式非常灵活,支持常见的正则操作,如字符类、量词、锚点、分组等。


📖 目录

  1. 正则表达式概述
  2. 导入正则表达式库
  3. 正则表达式的基础语法
  4. 正则表达式匹配操作
  5. 正则表达式分组
  6. 正则表达式替换
  7. 正则表达式匹配字符
  8. 正则表达式的高级应用
  9. 参考资料

1. 正则表达式概述

在 Scala 中,正则表达式用于匹配文本数据,类似于其他编程语言。Scala 中的正则表达式通过 scala.util.matching.Regex 提供了强大的支持。正则表达式可以帮助我们在字符串中搜索模式、提取数据或进行替换操作。

正则表达式是由一组字符组成的字符串,表示一种匹配模式,用于在文本中查找和操作匹配的子字符串。


2. 导入正则表达式库

在 Scala 中使用正则表达式时,通常需要导入 scala.util.matching.Regex 类。该类提供了对正则表达式的基本操作。

import scala.util.matching.Regex


3. 正则表达式的基础语法

Scala 中的正则表达式遵循 Java 正则表达式的语法,常见的基本语法元素包括字符类、量词、锚点和元字符。

常见正则表达式元素

  • 元字符., ^, $, *, +, ?, |, [], (), {}
  • 字符类[a-z][0-9]\d\w\s
  • 锚点^(匹配字符串开始)、$(匹配字符串结尾)
  • 量词*(零个或多个)、+(一个或多个)、?(零个或一个)
  • 分组() 用于分组匹配。
  • 反向引用\\1(引用分组中的第一个子模式)。

基础示例

val pattern = "abc".r
val str = "abcabc"

println(pattern.findFirstIn(str))  // 输出:Some(abc)

在这个示例中,"abc".r 将字符串 "abc" 转换为正则表达式对象,findFirstIn 方法查找该模式的第一个匹配。


4. 正则表达式匹配操作

正则表达式提供了多种方法来执行匹配操作,包括查找、替换和分割等。

查找匹配

findFirstIn 用于查找第一个匹配的子串。

val pattern = "\\d+".r  // 匹配一个或多个数字
val str = "There are 123 apples"

println(pattern.findFirstIn(str))  // 输出:Some(123)

findAllIn 用于查找所有匹配的子串。

val str = "There are 123 apples and 456 oranges"
println(pattern.findAllIn(str).mkString(", "))  // 输出:123, 456

检查是否匹配

matches 方法用于检查整个字符串是否完全符合正则表达式的模式。

val pattern = "[a-z]+".r
val str = "hello"

println(pattern.matches(str))  // 输出:true


5. 正则表达式分组

正则表达式支持分组,可以将匹配的部分捕获到不同的组中,后续可以引用这些分组。

分组示例

val pattern = "(\\d+)-(\\d+)".r
val str = "123-456"

str match {
  case pattern(first, second) => println(s"First: $first, Second: $second")  // 输出:First: 123, Second: 456
  case _ => println("No match")
}

在这个示例中,(\\d+)-(\\d+) 匹配由两个数字部分组成的模式,firstsecond 捕获到分组中的数字。


6. 正则表达式替换

正则表达式还可以用于替换字符串中的内容。replaceAll 方法可以替换所有匹配的部分,replaceFirst 替换第一个匹配部分。

替换示例

val pattern = "\\d+".r
val str = "There are 123 apples and 456 oranges"

println(pattern.replaceAll(str, "#"))  // 输出:There are # apples and # oranges

在这个示例中,replaceAll# 替换了所有匹配的数字部分。


7. 正则表达式匹配字符

正则表达式可以匹配各种字符类型,如字母、数字、空格等。

匹配字母和数字

val pattern = "[a-zA-Z0-9]+".r
val str = "Scala123"

println(pattern.matches(str))  // 输出:true

在这个示例中,正则表达式 [a-zA-Z0-9]+ 匹配由字母和数字组成的字符串。

匹配空格

val pattern = "\\s+".r
val str = "Hello   World"

println(pattern.findFirstIn(str))  // 输出:Some(   )

在这个示例中,\\s+ 匹配一个或多个空格字符。


8. 正则表达式的高级应用

正则表达式不仅可以执行简单的匹配操作,还可以进行更复杂的模式匹配,如前瞻和后顾(lookahead & lookbehind)等高级操作。

前瞻匹配

val pattern = "\\d(?=\\D)".r
val str = "123a456"

println(pattern.findAllIn(str).mkString(", "))  // 输出:3, 6

在这个示例中,\\d(?=\\D) 匹配后面跟着非数字字符的数字(即前瞻匹配)。

后顾匹配

val pattern = "(?<=\\d)\\D".r
val str = "123a456"

println(pattern.findAllIn(str).mkString(", "))  // 输出:a

在这个示例中,(?<=\\d)\\D 匹配前面是数字的非数字字符(即后顾匹配)。


9. 参考资料


Scala 的正则表达式功能强大,能够处理各种复杂的文本模式匹配需求。掌握正则表达式将大大增强你在字符串处理、文本搜索和数据提取等方面的能力。