scala 正则表达式匹配_Scala教程–正则表达式,匹配

scala 正则表达式匹配

前言

这是面向初学者的Scala教程的第5部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。

这篇文章是有关正则表达式(regexes)的两个文章中的第一篇,正则表达式对于各种编程任务,尤其是计算语言学任务都是必不可少的。 本教程介绍了如何在Scala中使用它们,前提是读者已经熟悉正则表达式语法。 它展示了如何在Scala中创建正则表达式,以及如何将它们与Scala强大的模式匹配功能一起使用,尤其是在变量表达式和匹配表达式中的情况下。

创建正则表达式

Scala提供了一种非常简单的创建正则表达式的方法:只需将正则表达式定义为字符串,然后在其上调用r方法。 下面定义了表征字符串语言的正则表达式 a ^ mb ^ n (一个或多个a后面跟一个或多个b ,不一定与a的数目相同)。

scala> val AmBn = "a+b+".r
AmBn: scala.util.matching.Regex = a+b+

要使用元字符,例如\ s\ w\ d ,您必须转义斜杠或使用多引号字符串,这被称为原始字符串。 以下是两种等效的编写正则表达式的方法,该正则表达式覆盖一系列单词字符的字符串和一个数字序列。

scala> val WordDigit1 = "\\w+\\d+".r
WordDigit1: scala.util.matching.Regex = \w+\d+
 
scala> val WordDigit2 = """\w+\d+""".r
WordDigit2: scala.util.matching.Regex = \w+\d+

最好转义还是使用原始字符串取决于上下文。 例如,使用上面的代码,我将使用原始字符串。 但是,对于使用正则表达式在空白字符上拆分字符串,转义在某种程度上是可取的。

scala> val adder = "We're as similar as two dissimilar things in a pod.\n\t-Blackadder"
adder: java.lang.String =
We're as similar as two dissimilar things in a pod.
-Blackadder
 
scala> adder.split("\\s+")
res2: Array[java.lang.String] = Array(We're, as, similar, as, two, dissimilar, things, in, a, pod., -Blackadder)
 
scala> adder.split("""\s+""")
res3: Array[java.lang.String] = Array(We're, as, similar, as, two, dissimilar, things, in, a, pod., -Blackadder)

关于命名的注意事项:Scala中的约定是将变量名的首字母大写用于正则表达式对象。 这使它们与在match语句中使用模式匹配一​​致,如下所示。

与正则表达式匹配

我们在上面看到,在String上使用r方法将返回一个正则表达式对象的值(有关下面的scala.util.matching部分的更多信息)。 您实际上如何使用这些Regex对象做有用的事情? 有很多方法。 对于非计算语言学家来说,最漂亮的,也许是最常见的,是将它们与Scala的标准模式匹配功能结合使用。 让我们考虑一下解析名称并将其转换为有用的数据结构以完成各种有用的事情的任务。

scala> val Name = """(Mr|Mrs|Ms)\. ([A-Z][a-z]+) ([A-Z][a-z]+)""".r
Name: scala.util.matching.Regex = (Mr|Mrs|Ms)\. ([A-Z][a-z]+) ([A-Z][a-z]+)
 
scala> val Name(title, first, last) = "Mr. James Stevens"
title: String = Mr
first: String = James
last: String = Stevens
 
scala> val Name(title, first, last) = "Ms. Sally Kenton"
title: String = Ms
first: String = Sally
last: String = Kenton

注意在Array和List等类型上与模式匹配的相似性。

scala> val Array(title, first, last) = "Mr. James Stevens".split(" ")
title: java.lang.String = Mr.
first: java.lang.String = James
last: java.lang.String = Stevens
 
scala> val List(title, first, last) = "Mr. James Stev

你可能感兴趣的:(字符串,python,java,大数据,编程语言)