首家大数据培训挂牌机构 股票代码:837906 | EN CN

Scala正则表达式

于2017-07-06由小牛君创建

分享到:


Scala支持通过Regex类的scala.util.matching封装正则表达式。让我们看看一个例子,我们将尝试从Scala中一个语句中找出单词:

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

当上述代码被编译和执行时,它产生了以下结果:

C:/>scalac Test.scala
C:/>scala Test
Some(Scala)

C:/>

我们创建一个字符串,并调用r()方法就可以了。Scala中字符串隐式转换为一个RichString并调用该方法来获得正则表达式的一个实例。找到第一个正则表达式匹配,只需调用findFirstIn()方法。而非只找到第一次出现。如果想找到匹配的单词的所有事件,可以使用findAllIn()方法,并在情况下,有目标字符串中使用多个Scala的单词,这将返回所有匹配的集合单词。

可以使用mkString()方法来连接所产生的服务,可以使用管道(|)搜索Scala中小型和资本的情况下,使用正则表达式构造来代替或r()方法创建一个模式如下:

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

当上述代码被编译和执行时,它产生了以下结果:

C:/>scalac Test.scala
C:/>scala Test
Scala,scala

C:/>

如果想更换匹配的文本,可以使用replaceFirstIn()以取代第一个匹配项或replaceAllIn(),以取代所有出现如下:

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

当上述代码被编译和执行时,它产生了以下结果:

C:/>scalac Test.scala
C:/>scala Test
Java is scalable and cool

C:/>

形成正则表达式:

Scala继承了Java,这反过来又继承了大部分的Perl的功能,它的正则表达式语法。这里只是一些例子,应该是足够的说明:

下面是表,列出了所有的正则表达式元字符的语法可用在Java中:

子表达式 匹配
^ 匹配行头 
$ 匹配行尾
. 匹配除换行符任何单个字符。用m选项也允许使之匹配换行符。
[...] 匹配括号内任何单个字符。
[^...] 匹配任何单个字符不是在括号中
A 整个字符串的开始
z 整个字符串结束
 最终,除了允许的最后行结束整个字符串。
re* 匹配0或多次出现前面表达式。
re+ 匹配1个或多个的先前东西
re? 匹配0或1发生前表达式。
re{ n} 精确匹配n个前面表达式的数量。
re{ n,} 匹配n或多次出现前面的表达。
re{ n, m} 至少匹配n和在前面的表现最为m次出现。
a|b 匹配a或b。
(re) 组正则表达式并记住匹配的文本。
(?: re) 组正则表达式而不记住匹配的文本。
(?> re) 匹配独立模式而不反向追踪。
w 匹配单词字符。
W 匹配非单词字符。
s 匹配空白。相当于 [ f].
S 匹配非空白。
d 匹配数字。相当于 [0-9].
D 匹配非数字。
A 匹配开始的字符串。
 匹配字符串的结尾。如果一个换行符存在,它只是换行之前匹配。
z 匹配字符串的结尾。
G 匹配点,最后一次匹配结束。
反向引用以捕获组编号 "n"
 匹配单词边界之外时,括号内。匹配退格(0×08)括号里面。
B 匹配非单词边界。
, , etc. 匹配换行符,回车,制表符等
Q 转义(引用)所有字符为 E
E 尾部引用开始 Q

正则表达式的例子:

示例 描述
. 匹配除了换行符的任何字符
[Rr]uby 匹配 "Ruby" 或"ruby"
rub[ye] 匹配"ruby" 或 "rube"
[aeiou] 匹配任何一个小写元音
[0-9] 匹配任何数字;同 [0123456789]
[a-z] 匹配任意小写ASCII字母
[A-Z] 匹配任意大写ASCII字母
[a-zA-Z0-9] 匹配任何上述
[^aeiou] 匹配元音以外的任何一个小写字符
[^0-9] 匹配数字以外的任何其他
d 匹配一个数字: [0-9]
D 匹配一个非数字: [^0-9]
s 匹配一个空白字符: [ f]
S 匹配非空白: [^ f]
w 匹配一个字符: [A-Za-z0-9_]
W 匹配 一个非单词字符: [^A-Za-z0-9_]
ruby? 匹配 "rub" or "ruby": the y is optional
ruby* 匹配 "rub" plus 0 or more ys
ruby+ 匹配 "rub" plus 1 or more ys
d{3} 匹配只有 3 个数字
d{3,} 匹配 3 个或多个数字
d{3,5} 匹配3, 4, 或5 个数字
Dd+ 不分组: + repeats d
(Dd)+/ 分组: + repeats Dd 对
([Rr]uby(, )?)+ 匹配 "Ruby", "Ruby, ruby, ruby", 等.

需要注意的是每一个反斜杠上述字符串中出现两次。这是因为在Java和Scala一个反斜杠是一个转义字符的字符串,而不是一个普通字符显示出来的字符串。所以不是.. 需要写. 。得到的字符串中的一个反斜杠。请查看下面的例子:

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

当上述代码被编译和执行时,它产生了以下结果:

C:/>scalac Test.scala
C:/>scala Test
able1

C:/>