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文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati