- Scala Tutorial
- Scala - Home
- Scala - Overview
- Scala - Environment Setup
- Scala - Basic Syntax
- Scala - Data Types
- Scala - Variables
- Scala - Classes & Objects
- Scala - Access Modifiers
- Scala - Operators
- Scala - IF ELSE
- Scala - Loop Statements
- Scala - Functions
- Scala - Closures
- Scala - Strings
- Scala - Arrays
- Scala - Collections
- Scala - Traits
- Scala - Pattern Matching
- Scala - Regular Expressions
- Scala - Exception Handling
- Scala - Extractors
- Scala - Files I/O
- Scala Useful Resources
- Scala - Quick Guide
- Scala - Useful Resources
- Scala - Discussion
Scala - 正则表达式
本章介绍 Scala 如何通过scala.util.matching 包中提供的Regex类支持正则表达式。
尝试下面的示例程序,我们将尝试从语句中找出单词Scala 。
例子
import scala.util.matching.Regex object Demo { def main(args: Array[String]) { val pattern = "Scala".r val str = "Scala is Scalable and cool" println(pattern findFirstIn str) } }
将上述程序保存在Demo.scala中。以下命令用于编译和执行该程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Some(Scala)
我们创建一个 String 并对其调用r( )方法。Scala 隐式地将 String 转换为 RichString 并调用该方法来获取 Regex 的实例。要查找正则表达式的第一个匹配项,只需调用findFirstIn()方法即可。如果我们不想只查找第一个出现的单词,而是希望查找所有出现的匹配单词,则可以使用 findAllIn ()方法,如果目标字符串中有多个可用的 Scala 单词,这将返回所有匹配单词的集合字。
您可以使用 mkString( ) 方法来连接结果列表,并且可以使用竖线 (|) 来搜索 Scala 的小写和大写字母,并且可以使用 Regex 构造函数或 r() 方法来创建模式。
尝试以下示例程序。
例子
import scala.util.matching.Regex object Demo { def main(args: Array[String]) { val pattern = new Regex("(S|s)cala") val str = "Scala is scalable and cool" println((pattern findAllIn str).mkString(",")) } }
将上述程序保存在Demo.scala中。以下命令用于编译和执行该程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Scala,scala
如果您想替换匹配的文本,我们可以使用replaceFirstIn()来替换第一个匹配项,或者使用replaceAllIn()来替换所有匹配项。
例子
object Demo { def main(args: Array[String]) { val pattern = "(S|s)cala".r val str = "Scala is scalable and cool" println(pattern replaceFirstIn(str, "Java")) } }
将上述程序保存在Demo.scala中。以下命令用于编译和执行该程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Java is scalable and cool
形成正则表达式
Scala 继承了 Java 的正则表达式语法,而 Java 又继承了 Perl 的大部分功能。这里只是一些足以复习的例子 -
下表列出了 Java 中可用的所有正则表达式元字符语法。
子表达式 | 火柴 |
---|---|
^ | 匹配行首。 |
$ | 匹配行尾。 |
。 | 匹配除换行符之外的任何单个字符。使用 m 选项也可以匹配换行符。 |
[...] | 匹配括号中的任何单个字符。 |
[^...] | 匹配不在括号中的任何单个字符 |
\\A | 整个字符串的开头 |
\\z | 整个字符串的结尾 |
\\Z | 整个字符串的结尾(允许的最后行终止符除外)。 |
关于* | 匹配 0 次或多次出现的前面表达式。 |
重新+ | 匹配 1 个或多个前一个事物 |
关于? | 匹配前面表达式的 0 或 1 次出现。 |
重新{n} | 精确匹配前面表达式的 n 次出现。 |
重新{n,} | 匹配 n 次或多次出现的前面表达式。 |
重新{n,m} | 匹配前面表达式至少出现 n 次、最多出现 m 次。 |
a|b | 匹配 a 或 b。 |
(关于) | 对正则表达式进行分组并记住匹配的文本。 |
(?: 关于) | 对正则表达式进行分组,而不记住匹配的文本。 |
(?> 重新) | 匹配独立模式而不回溯。 |
\\w | 匹配单词字符。 |
\\W | 匹配非单词字符。 |
\\s | 匹配空白。相当于[\t\n\r\f]。 |
\\S | 匹配非空白。 |
\\d | 匹配数字。相当于[0-9]。 |
\\D | 匹配非数字。 |
\\A | 匹配字符串的开头。 |
\\Z | 匹配字符串结尾。如果存在换行符,则它会在换行符之前匹配。 |
\\z | 匹配字符串结尾。 |
\\G | 上一场比赛结束的比赛点。 |
\\n | 反向引用捕获组号“n” |
\\b | 匹配括号外的单词边界。在括号内时匹配退格键 (0x08)。 |
\\B | 匹配非单词边界。 |
\\n、\\t 等 | 匹配换行符、回车符、制表符等。 |
\\Q | 转义(引用)直到 \\E 的所有字符 |
\\E | 结束以 \\Q 开头的引用 |
正则表达式示例
例子 | 描述 |
---|---|
。 | 匹配除换行符之外的任何字符 |
[Rr]尤比 | 匹配“Ruby”或“Ruby” |
擦[耶] | 匹配“ruby”或“rube” |
[艾欧] | 匹配任意一个小写元音 |
[0-9] | 匹配任意数字;与[0123456789]相同 |
[阿兹] | 匹配任何小写 ASCII 字母 |
[AZ] | 匹配任何大写 ASCII 字母 |
[a-zA-Z0-9] | 匹配以上任何一项 |
[^aeiou] | 匹配小写元音以外的任何内容 |
[^0-9] | 匹配数字以外的任何内容 |
\\d | 匹配数字:[0-9] |
\\D | 匹配非数字:[^0-9] |
\\s | 匹配空白字符:[ \t\r\n\f] |
\\S | 匹配非空白:[^ \t\r\n\f] |
\\w | 匹配单个单词字符:[A-Za-z0-9_] |
\\W | 匹配非单词字符:[^A-Za-z0-9_] |
Ruby? | 匹配“rub”或“ruby”:y 是可选的 |
Ruby* | 匹配“rub”加0个或多个ys |
Ruby+ | 匹配“rub”加上 1 个或多个 y |
\\d{3} | 精确匹配 3 位数字 |
\\d{3,} | 匹配 3 个或更多数字 |
\\d{3,5} | 匹配 3、4 或 5 位数字 |
\\D\\d+ | 无组:+ 重复 \\d |
(\\D\\d)+/ | 分组:+ 重复 \\D\d 对 |
([Rr]uby(, )?)+ | 匹配“Ruby”、“Ruby、Ruby、Ruby”等。 |
注意- 每个反斜杠在上面的字符串中出现两次。这是因为在 Java 和 Scala 中,单个反斜杠是字符串文字中的转义字符,而不是字符串中显示的常规字符。因此,您需要编写“\\”而不是“\”以在字符串中获取单个反斜杠。
尝试以下示例程序。
例子
import scala.util.matching.Regex object Demo { def main(args: Array[String]) { val pattern = new Regex("abl[ae]\\d+") val str = "ablaw is able1 and cool" println((pattern findAllIn str).mkString(",")) } }
将上述程序保存在Demo.scala中。以下命令用于编译和执行该程序。
命令
\>scalac Demo.scala \>scala Demo
输出
able1