9.9 正则表达式

Scala通过scala.util.matching包里的类支持正则表达式②。创建正则表达式,就是在用这个包里的Regex类的实例在工作。假定我们要检查给定字符串是否包含Scala或是scala:

②关于正则表达式更详细的讨论,请参考Jeffrey E. F. Friedl的Mastering Regular Expressions [Fri97]。


PatternMatching/RegularExpr.scala

  1. val pattern = "(S|s)cala".r
  2. val str = "Scala is scalable and cool"
  3. println(pattern findFirstIn str)

这里创建了一个String,然后,调用了它的r()方法。Scala会隐式的将String转换成RichString,调用这个方法得到一个Regex实例。当然,如果正则表达式需要转义字符,用原始字符串会好一些。"""\d2:\d2:\d4"""写起来和读起来都比"\d2:\d2: \d4"容易得多。

为了找到正则表达式的第一个匹配,调用findFirstIn()方法即可。在上面的代码里,这会从给定文本里找到Scala。

如果要找的不只是匹配单词第一次出现的地方,而是要找所有出现的地方,可以使用findAllIn(),如下所示。这会返回一个由所有匹配单词组成的容器。在这个例子里,就是(Scala, scala)。

PatternMatching/RegularExpr.scala

  1. println((pattern findAllIn str).mkString(", "))

在上面的代码里,用mkString()方法将元素的结果list连接起来。

如果想替换匹配字符串,可以用replaceFirstIn()替换第一个匹配(如下面例子所示),或者用replaceAllIn()替换所有匹配的地方:

PatternMatching/RegularExpr.scala

  1. println("cool".r replaceFirstIn(str, "awesome"))

执行上述三个正则表达式的方法,输出如下:

  1. Some(Scala)
  2. Scala, scala
  3. Scala is scalable and awesome

如果你熟悉正则表达式,在Scala里用起来就会很简单。