正则表达式的匹配
正则表达式可以很方便地从符合特定结构的字符串中提取数据。
Scala封装了Java 的正则表达式。以下给出一个示例:
1 // src/main/scala/progscala2/patternmatching/match-regex.sc 2 3 val BookExtractorRE = """Book: title=([^,]+),\s+author=(.+)""".r // ➊ 4 val MagazineExtractorRE = """Magazine: title=([^,]+),\s+issue=(.+)""".r 5 6 val catalog = Seq( 7 "Book: title=Programming Scala Second Edition, author=Dean Wampler", 8 "Magazine: title=The New Yorker, issue=January 2014", 9 "Unknown: text=Who put this here??" 10 ) 11 12 for (item <- catalog) { 13 item match { 14 case BookExtractorRE(title, author) => // ➋ 15 println(s"""Book "$title", written by $author""") 16 case MagazineExtractorRE(title, issue) => 17 println(s"""Magazine "title", issue $issue""") 18 case entry => println(s"Unrecognized entry: $entry") 19 } 20 }
- ➊ 该正则表达式匹配一个用于表示书本的字符串,其中有两个捕捉组(注意正则表达式中的括号),一个表示标题,一个表示作者。调用 r 方法以创建正则表达式。第二个正则表达式匹配一个用于表示杂志的字符串,其中的捕捉组表示杂志标题和发行时间。
- ➋ 用法与 case 类相似,与捕捉组相匹配的字符串被提取出来,赋值给变量。
运行的输出为:
Book "Programming Scala Second Edition", written by Dean Wampler
Magazine "The New Yorker", issue January 2014
Unrecognized entry: Unknown: text=Who put this here??
我们用三重双引号来表示正则表达式字符串,否则,就不得不对正则表达式的反斜杠进行转义,例如用 \\s 表示 \s。你还可以通过创建一个 Regex类的实例来定义正则表达式,如new Regex("""\W"""),但这种用法并不常见。
在三个双引号内的正则表达式中使用变量插值是无效的。你依然需要对变量插值进行转义,例如,你应该用 s"""$first\\s+$second""".r,而不是s"""$first\s+$second""".r。而如果你没有使用变量插值,则不必转义。
scala.util.matching.Regex 定义了若干个用于正则表达式其他操作的方法,如查找和替换。