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,您可以使用正则表达式构造函数或 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继承其正则表达式语法反过来继承了Perl的大部分功能.以下是一些应该足够作为刷新和减号的示例;

以下列出了Java中可用的所有正则表达式Meta字符语法.

Subexpression匹配
^匹配行首.
$匹配行尾.
.匹配除换行符之外的任何单个字符.使用m选项也可以匹配换行符.
[...]匹配括号中的任何单个字符.
[^ .. .]匹配括号内的任何单个字符
\\A整个字符串的开头
\\\\整个字符串的结尾
\\Z除了允许的最终行终止符之外的整个字符串的结束.
re *匹配0个或更多前面的表达式.
re +匹配前一项中的一项或多项
re?匹配前面表达式的0或1次出现.
re {n}完全匹配前面表达式的n次出现次数.
re {n,}匹配前面表达式的n次或多次出现.
re {n,m}匹配前面表达式中至少n次且最多m次出现.
a | b匹配a或b.
(重新)分组正则表达式并记住匹配的文本.
(?:re)将正则表达式分组而不记住匹配的文本.
(?> re)匹配独立模式而不回溯.
\\\\匹配单词字符.
\\W匹配非单词字符.
\\ n匹配空格.相当于[\\\\\\\\].
\ \S匹配非空白.
\ \d匹配数字.相当于[0-9].
\\D匹配非数字.
\\A匹配字符串的开头.
\\Z匹配字符串结尾.如果存在换行符,则它在换行符之前匹配.
\\ z匹配字符串结尾.
\\G匹配最后一场比赛结束的点.
\ \ n对捕获组号"n"的反向引用
\\b在括号外匹配字边界.在括号内匹配退格键(0x08).
\\B匹配非单词边界.
\\ n,\\\ \\ t等等.匹配换行符,回车符,制表符等.
\\QEscape(引用)所有字符,最多为\\ E
\\ E结束以\\Q开头的报价

正则表达式示例

示例描述
.匹配除换行符之外的任何字符
[Rr] uby匹配"Ruby"或"ruby"
rub [ye]匹配"ruby"或"rube"
[aeiou]匹配任何一个小写元音
[0-9]匹配任何数字;与[0123456789]相同
[az]匹配任何小写ASCII字母
[AZ]匹配任何大写的ASCII字母
[a-zA-Z0-9]匹配以上任何一项
[^ aeiou]匹配小写元音以外的任何内容
[^ 0-9 ]匹配除数字以外的任何内容
\\ \\\d匹配一个数字:[0-9]
\\ D匹配非数字:[^ 0-9]
\\\\匹配空格字符:[\\\\\\\\\\\\>
\\S匹配非空白:[^ \\ \\ t \\\\\\ []
\\\\匹配单个字符:[A-Za-z0-9_ ]
\\ W匹配a非单词字符:[^ A-Za-z0-9 _]
ruby?匹配"rub"或"ruby":y是可选的
ruby *匹配"rub"加0或更多ys
ruby +匹配"rub"加上1或更多ys
\\\\ {3}正好匹配3位数
\\\\ {3,}匹配3位或以上
\\\\ {3,5}匹配3,4或5位
\\D \\ n +否组: + 重复\\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