9.9 正则表达式
Scala通过scala.util.matching
包里的类支持正则表达式②。创建正则表达式,就是在用这个包里的Regex
类的实例在工作。假定我们要检查给定字符串是否包含Scala或是scala:
②关于正则表达式更详细的讨论,请参考Jeffrey E. F. Friedl的Mastering Regular Expressions [Fri97]。
PatternMatching/RegularExpr.scala
val pattern = "(S|s)cala".r
val str = "Scala is scalable and cool"
println(pattern findFirstIn str)
这里创建了一个String
,然后,调用了它的r()
方法。Scala会隐式的将String
转换成RichString
,调用这个方法得到一个Regex
实例。当然,如果正则表达式需要转义字符,用原始字符串会好一些。"""\d2:\d2:\d4"""
写起来和读起来都比"\d2:\d2: \d4"
容易得多。
为了找到正则表达式的第一个匹配,调用findFirstIn()
方法即可。在上面的代码里,这会从给定文本里找到Scala。
如果要找的不只是匹配单词第一次出现的地方,而是要找所有出现的地方,可以使用findAllIn()
,如下所示。这会返回一个由所有匹配单词组成的容器。在这个例子里,就是(Scala, scala
)。
PatternMatching/RegularExpr.scala
println((pattern findAllIn str).mkString(", "))
在上面的代码里,用mkString()
方法将元素的结果list连接起来。
如果想替换匹配字符串,可以用replaceFirstIn()
替换第一个匹配(如下面例子所示),或者用replaceAllIn()
替换所有匹配的地方:
PatternMatching/RegularExpr.scala
println("cool".r replaceFirstIn(str, "awesome"))
执行上述三个正则表达式的方法,输出如下:
Some(Scala)
Scala, scala
Scala is scalable and awesome
如果你熟悉正则表达式,在Scala里用起来就会很简单。