Scala教程–正则表达式,匹配

前言 这是面向初学者的Scala教程的第5部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。 这篇文章是有关正则表达式(regexes)的两个文章中的第一篇,正则表达式对于广泛的编程任务,尤其是计算语言学任务至关重要。 本教程介绍了如何在Scala中使用它们,...
摘要由CSDN通过智能技术生成

前言

这是面向初学者的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 Stevens".split(" ").toList
title: java.lang.String = Mr.
first: java.lang.S
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值