Scala之旅-正则表达式模式和提取器对象(EXTRACTOR OBJECTS)

本文主要是介绍Scala之旅-正则表达式模式和提取器对象(EXTRACTOR OBJECTS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正则表达式模式

正则表达式是用于查找数据中的模式的字符串。任何字符串都可以使用 .r 方法转换为正则表达式。

import scala.util.matching.Regex
val numberPattern: Regex = "[0-9]".r
numberPattern.findFirstMatchIn("awesomepassword") match {case Some(_) => println("Password OK")case None => println("Password must contain a number")
}

这里写图片描述
在上面的例子中,numberPattern 是一个 Regex (正则表达式),我们可以用它来确保一个密码中需包含一个数字。

你也可以使用圆括号匹配正则表达式组。

import scala.util.matching.Regex
val keyValPattern: Regex = "([0-9a-zA-Z-#() ]+): ([0-9a-zA-Z-#() ]+)".r
val input: String ="""background-color: #A03300;|background-image: url(img/header100.png);|background-position: top center;|background-repeat: repeat-x;|background-size: 2160px 108px;|margin: 0;|height: 108px;|width: 100%;""".stripMargin
for (patternMatch <- keyValPattern.findAllMatchIn(input))println(s"key: ${patternMatch.group(1)} value: ${patternMatch.group(2)}")

这里写图片描述
这里我们解析出字符串的键和值。每个匹配都有一组子匹配。下面是输出结果:

key: background-color value: #A03300
key: background-image value: url(img
key: background-position value: top center
key: background-repeat value: repeat-x
key: background-size value: 2160px 108px
key: margin value: 0
key: height value: 108px
key: width value: 100

这里写图片描述

提取器对象(EXTRACTOR OBJECTS)

提取器对象是一个含有 unapply 方法的对象。而 apply 方法就像一个带参数并创建对象的构造器,unapply 方法接受一个对象并尝试返回参数。这个最常使用在模式匹配和部分函数中。

import scala.util.Random
object CustomerID {def apply(name: String) = s"$name--${Random.nextLong}"def unapply(customerID: String): Option[String] = {val name = customerID.split("--").headif (name.nonEmpty) Some(name) else None}
}
val customer1ID = CustomerID("Sukyoung")  // Sukyoung--23098234908
customer1ID match {case CustomerID(name) => println(name)  // prints Sukyoungcase _ => println("Could not extract a CustomerID")
}

这里写图片描述
apply 方法根据 name 创建了 CustomerID 字符串。unapply 方法反过来求 name。当我们调用 CustomerID("Sukyoung") 时,这其实是 CustomerID.apply("Sukyoung") 的缩写形式。当我们调用 case CustomerID(name) => println(name) 时,我们调用的是 unapply 方法。

unapply 方法也可以用于分配一个值。

val customer2ID = CustomerID("Nico")
val CustomerID(name) = customer2ID
println(name)  // prints Nico

这种写法和 val name = CustomerID.unapply(customer2ID).get 是等价的。

如果不匹配,将会抛出一个 scala.MatchError

val CustomerID(name2) = "--asdfasdfasdf"

这里写图片描述
unapply 的返回类型选择如下:

  • 如果仅仅是测试,则返回一个 boolean,例如 case even()
  • 如果返回 T 类型的单个子值,则返回 Option[T]
  • 如果你想返回几个子值 T1,..,Tn,则可以把它们分配在可选择的元组(tuple)中 Option[(T1,...,Tn)]

有时,由于返回的子值数量不固定,我们将会返回一个序列。由于这个原因,你也可以通过 unapplySeq 定义模式来返回 Option[Seq[T]] ,这种机制使用在 case List(x1, ..., xn) 模式中。

这篇关于Scala之旅-正则表达式模式和提取器对象(EXTRACTOR OBJECTS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600676

相关文章

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

Java轻松实现在Excel中插入、提取或删除文本框

《Java轻松实现在Excel中插入、提取或删除文本框》在日常的Java开发中,我们经常需要与Excel文件打交道,当涉及到Excel中的文本框时,许多开发者可能会感到棘手,下面我们就来看看如何使用J... 目录Java操作Excel文本框的实战指南1. 插入Excel文本框2. 提取Excel文本框内容3

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr