Scala正则表达式
正则表达式是高级编程语言中经常用到的重要概念,Scala 作为一种支持面向对象的函数式编程语言,也对正则表达式进行了超越传统的库支持。本篇文章将为您介绍 Scala 正则表达式的基本语法和用例。
正则表达式是什么?
正则表达式是一种文本模式,用于匹配特定文本串的模式。正则表达式是由普通字符(例如,字符 a 到 z)以及特殊字符(称为元字符)组成的文本模式。例如,文本模式 a*
是由字符 a
重复 0 次以上组成的。
正则表达式基本语法
Scala 中的正则表达式使用 java.util.regex
库进行处理。您可以使用 val r = "hello".r
创建一个正则表达式,然后使用 r.findFirstIn("hello world")
可以在 “hello world” 字符串中查找所匹配的字符串。下面是一些基本的正则表达式语法:
字符串匹配
表达式 | 匹配 |
---|---|
. | 匹配任意单个字符,除了行结束符 |
\w | 匹配字母或数字或下划线或汉字 |
\W | 匹配任何不是字母或数字或下划线或汉字的字符 |
\d | 匹配数字 |
\D | 匹配非数字 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等 |
\S | 匹配任何非空白字符 |
\b | 匹配单词边界,例如 er\b 可以匹配 “never” 中的 “er”,但不能匹配 “verb” 中的 “er”。 |
\B | 匹配非单词边界 |
数量词
表达式 | 匹配 |
---|---|
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。 |
{n} | n 为非负整数。正好匹配 n 次。 |
{n,} | n 为非负整数。至少匹配 n 次。 |
{n,m} | m 和 n 均为非负整数,其中 n<=m。匹配至少 n 次,至多匹配 m 次 |
特殊字符
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 Multiline 标志,它还会匹配”(\n)”后紧接着开头的位置。 |
$ | 匹配输入字符串结尾的位置。如果设置了 Multiline 标志,它还会匹配”(\n)”前紧接着结尾的位置。 |
| 或运算符。匹配左边表达式或右边表达式。例如, abc|def 可以匹配 “abc” 或 “def” |
|
() | 捕获组。匹配并捕获匹配的字符串。可以使用 1、2 … $9 访问捕获的分组。 |
下面是一些 Scala 正则表达式的用例:
val pattern = "Scala".r
val str = "Scala is a modern programming language."
val matches = pattern.findAllIn(str)
matches.foreach(println) // 输出结果:Scala
val pattern = "[0-9]+".r
val str = "There are 6 apples, 12 oranges, and 3 peaches."
val matches = pattern.findAllIn(str)
matches.foreach(num => println(num.toInt)) // 输出结果:6 12 3
val pattern = "([0-9]+)/([0-9]+)/([0-9]+)".r
val str = "Today is 2022/11/18"
val matches = pattern.findAllIn(str)
matches.foreach(date => println("Year: " + date.group(1) + " Month: " + date.group(2) + " Day: " + date.group(3))) // 输出结果:Year: 2022 Month: 11 Day: 18
正则表达式相关函数
除了前面示例的 findAllIn
函数,Scala 中还提供了一些与正则表达式相关的函数供开发者使用:
findFirstIn(str: String): Option[String]
查找字符串 str 中第一个匹配正则表达式的子字符串。
val pattern = "[0-9]+".r
val str = "There are 6 apples, 12 oranges, and 3 peaches."
val num = pattern.findFirstIn(str).getOrElse("0")
println(num) // 输出结果:6
findFirstMatchIn(str: String): Option[Match]
查找字符串 str 中第一个匹配正则表达式的模式。
val pattern = "([0-9]+)/([0-9]+)/([0-9]+)".r
val str = "Today is 2022/11/18"
val date = pattern.findFirstMatchIn(str).get
println(s"Year: {date.group(1)} Month:{date.group(2)} Day: ${date.group(3)}") // 输出结果:Year: 2022 Month: 11 Day: 18
replaceAllIn(str: String, replacer: String): String
将字符串 str 中所有匹配正则表达式的子字符串替换为 replacer 。replacer 可以是一个字符串,也可以是一个函数。
val pattern = "Scala".r
val str = "Scala is a modern programming language."
val replaced = pattern.replaceAllIn(str, "Java")
println(replaced) // 输出结果:Java is a modern programming language.
split(str: String): Array[String]
将字符串 str 按正则表达式进行分割,并返回分割后的字符串数组。
val pattern = "[.,]+".r
val str = "I like dogs, cats, and birds."
val words = pattern.split(str)
words.foreach(println) // 输出结果:I like dogs cats and birds
使用正则表达式的注意事项
正则表达式中的转义字符
正则表达式中使用的某些字符是具有特殊意义的,例如 .
、*
、?
等。如果要匹配这些字符本身,需要在它们前面添加转义字符 \
。例如,要匹配 .
字符本身,正则表达式应该写成 \.
。
贪婪匹配和非贪婪匹配
正则表达式匹配时,默认会进行贪婪匹配。这意味着,在整个字符串中找到尽可能多的匹配子串。例如,对于字符串 “aaaa”,正则表达式 a*
将匹配整个字符串,而不是只匹配一个字符。
如果要进行非贪婪匹配,可以在量词后面加上问号 ?
。例如,a*?
匹配第一个 a
前面的空串。
结论
Scala 中的正则表达式使用和其他语言类似,有一些特定语法和函数,使其更适合在函数式编程环境中使用。正则表达式是处理文本数据的有力工具,在大规模数据分析和处理时具有重要作用。