在Scala中你只需要在正则表达式字符串后边加上一个".r"就可以使用正则表达式了。
scala> val numPattern = "[0-9]+".r
numPattern: scala.util.matching.Regex = [0-9]+
下面介绍正则表达式常用的两个匹配方法findFirstIn和findAllIn。
方法findFirstIn可以匹配到第一个符合正则表达式规则的字符串,没有匹配到任何结果的情况下返回None。
scala> val address = "123 Main Street Suite 101"
address: String = 123 Main Street Suite 101
scala> numPattern.findFirstIn(address)
res4: Option[String] = Some(123)
scala> numPattern.findFirstIn("abc")
res5: Option[String] = None
方法findAllIn可以匹配到所有符合正则表达式规则的字符串,返回的结果是一个Iterator。你可以把它转化为一个Array来使用。如果没有匹配到任何符合规则的字符换那么,它将返回一个空Iterator。
scala> val matchs = numPattern.findAllIn(address)
matchs: scala.util.matching.Regex.MatchIterator = non-empty iterator
scala> matchs.getClass()
res6: Class[_ <: scala.util.matching.Regex.MatchIterator] = class scala.util.matching.Regex$MatchIterator
scala> matchs.toArray.foreach(println(_))
123
101
scala> val matchs = numPattern.findAllIn("abc")
matchs: scala.util.matching.Regex.MatchIterator = empty iterator
接下来看看如何使用正则表达式来替换字符串。
我们可以调用字符串的replaceAll方法来进行字符换替换,这个方法接收两个参数,第一个是正则表达,第二个是要被替换成的字符串。
scala> "123 Main Street".replaceAll("[0-9]", "x")
res13: String = xxx Main Street
还有一种方式是,提前编译好一个正则表达式,然后调用正则表达式的replaceAllIn方法来进行替换。
scala> regex.replaceAllIn("123 Main Street", "x")
res15: String = xxx Main Street
如果你只想替换第一次出现的位置的字符换,而不是所有匹配的位置,那么你可以使用字符串的replaceFirst或者正则表达式的replaceFirstIn方法。
scala> "123".replaceFirst("[0-9]", "x")
res16: String = x23
scala> "[0-9]".r.replaceFirstIn("123","x")
res20: String = x23
然后我们继续讨论如何使用正则表达式来拆分字符串。
看一看如何使用正则表达式把"100 Bananas"拆分为100何Bananas两部分。
scala> val pattern = "([0-9]+) ([a-zA-Z]+)".r
pattern: scala.util.matching.Regex = ([0-9]+) ([a-zA-Z]+)
scala> val pattern(count, fruit) = "100 Bananas"
count: String = 100
fruit: String = Bananas