本章解释了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等等. | 匹配换行符,回车符,制表符等. |
\\Q | Escape(引用)所有字符,最多为\\ 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