Scala 补充 正则、异常处理...

devtools/2024/9/23 4:26:59/

Scala 补充 正则、异常处理、类型信息处理

基于前几篇文章 (Scala介绍与环境搭建、Scala 第一篇 基础篇、Scala 第二篇 算子篇、Scala 第三篇 OOP篇) 补充

  • 一、正则
    • 1、匹配
    • 2、替换
    • 3、分割
    • 4、分组
    • 5、练习
  • 二、异常处理
  • 三、类 型信息处理

一、正则

1、匹配

  1. 简单匹配

    scala">// 判断content是否为数字
    val content: String = "244"
    val regexStr: String = "\\d+"
    val bool = content.matches(regexStr)
    
  2. 查找:模式匹配,对象提取:【元组,样例类】

    scala">// 将字符串 content 中的数字和逗号分隔的数字序列解析成一个三元组,如果字符串不符合指定格式则返回一个包含三个 "INVALID" 字符串的三元组。
    import scala.util.matching.Regexval regex: Regex = "(\\d+),(\\d+),(\\d+)".r		// r 函数:将正则字符串转化为 正则(Regex) 对象
    val content: String = "12665473,33,33"
    val tp3: (String, String, String) =  content match {case regex(g1, g2, g3) => (g1, g2, g3)case _ => ("INVALID", "INVALID", "INVALID")
    }
    println(tp3) 		// 输出结果:(12665473,33,33)
    

2、替换

replaceFirstIn 用替换字符串替换原始字符串中第一个匹配到的文本,并返回替换后的新字符串。
replaceSomeIn 对原始字符串中所有匹配到的文本进行处理,根据传入的匹配函数,选择性地进行替换或保留,并返回替换后的新字符串。
replaceAllIn 将原始字符串中所有匹配到的文本都替换为指定的替换字符串,并返回替换后的新字符串。

使用样例

scala">val rtr = "(8\\d+)"         // 匹配以数字 8 开头的连续数字序列的正则表达式模式
val regex: Regex = rtr.r    // 创建正则表达式对象
val content = "java:88,mysql:80,scala:69,spark:75"// 将 content 中第一个匹配到的以数字 8 开头的连续数字序列替换为 "99"
val replace1: String = regex.replaceFirstIn(content, "99")// 将 content 中所有匹配到的以数字 8 开头的连续数字序列加上 10 后替换为新的数字
// 参二为函数 f:Matcher=>Option[String]
val replace2: String = regex.replaceSomeIn(content, m => Some((m.group(1).toInt + 10).toString))// 将 content 中所有匹配到的以数字 8 开头的连续数字序列替换为 "99"
val replace3: String = regex.replaceAllIn(content, "99")// 将 content 中所有匹配到的以数字 8 开头的连续数字序列加上 10 后替换为新的数字
// 参二为函数 f:Matcher=>String
val replace4: String = regex.replaceAllIn(content, m => (m.group(1).toInt + 10).toString)
println(replace1)
println(replace2)
println(replace3)
println(replace4)

输出

java:99,mysql:80,scala:69,spark:75
java:98,mysql:90,scala:69,spark:75
java:99,mysql:99,scala:69,spark:75
java:98,mysql:90,scala:69,spark:75

3、分割

scala">// 分割:将数字提取出来
val content = "11a,22b,cc33"
val split: Array[String] = content.split("[^0-9]+")
split.foreach(e => print(e + " ")) 	// 输出:11 22 33 

4、分组

分组:必须添加 ()
findFirstMatchIn
findAllMatchIn

样例

scala">val pat = "([a-z][a-zA-Z]+):(\\d+)".r
val scores = "java:88,mysql:80,hadoop:84,spark:91"
val option = pat.findFirstIn(scores) // 在 scores 中查找第一个匹配到的 "单词:数字" 格式的字符串,并返回一个 Option 对象
val it = pat.findAllIn(scores) // 在 scores 中查找所有匹配到的 "单词:数字" 格式的字符串,并返回一个迭代器
// it.foreach(println)	// Regex.Match match = regexXxx.findXxxMatchInt(content:String)
// val groupContent = match.group(id:Int)val mat = pat.findFirstMatchIn(scores) // 在 scores 中查找第一个匹配到的 "单词:数字" 格式的字符串,并返回一个 Option[Match] 对象
val mats = pat.findAllMatchIn(scores) // 在 scores 中查找所有匹配到的 "单词:数字" 格式的字符串,并返回一个迭代器[Match] 对象
mats.foreach(e => println(e.group(1) + " -> " + e.group(2))) 	// 分组提取

输出

java -> 88
mysql -> 80
hadoop -> 84
spark -> 91

5、练习

练习一:使用正则表达式解析日志
现有如下日志信息,请使用Scala正则表达式解析如下信息

日志级别	日期	请求URI
INFO 2016-07-25 requestURI:/c?app=0&p=1&did=18005472&industry=469&adid=31
INFO 2016-07-26 requestURI:/c?app=0&p=2&did=18005473&industry=472&adid=31
INFO 2016-07-27 requestURI:/c?app=0&p=1&did=18005474&industry=488&adid=32

代码

scala">val regex = "(INFO|WARN|ERROR) (\\d{4}-\\d{1,2}-\\d{1,2}) requestURI:(.*)".r
Array("INFO 2016-07-25 requestURI:/c?app=0&p=1&did=18005472&industry=469&adid=31","INFO 2016-07-26 requestURI:/c?app=0&p=2&did=18005473&industry=472&adid=31","INFO 2016-07-27 requestURI:/c?app=0&p=1&did=18005474&industry=488&adid=32"
).collect({   	// collect 自带偏函数case regex(level, date, url) => (level, date, url)
})
.foreach(e=> println("level: " + e._1 + "\tdate: " + e._2 + "\turl: " + e._3))

输出

level: INFO	date: 2016-07-25	url: /c?app=0&p=1&did=18005472&industry=469&adid=31
level: INFO	date: 2016-07-26	url: /c?app=0&p=2&did=18005473&industry=472&adid=31
level: INFO	date: 2016-07-27	url: /c?app=0&p=1&did=18005474&industry=488&adid=32

二、异常处理

  1. try...catch...

    scala">import scala.util.control.Exception
    try {// 可能会抛出异常的代码
    } catch {case e: ArithmeticException => // 处理 ArithmeticException 的代码// 其他类型的异常处理
    } finally {// 无论是否有异常发生,都会执行的代码
    }
    
  2. scala.util.control.Exception.{allCatch, failAsValue}

    scala">import scala.util.Try
    import scala.util.control.Exception.{allCatch, failAsValue}// 尝试执行可能会抛出异常的代码块,返回Option[Int],如果异常发生则返回None
    val resultOption: Option[Int] = allCatch.opt(10 / 0)// 返回Try[Int],如果异常发生则返回一个包含异常的Failure
    val resultTry: Try[Int] = allCatch.withTry(10 / 0)// 返回Either[Throwable, Int],如果异常发生则返回包含异常的Left
    val resultEither: Either[Throwable, Int] = allCatch.either(10 / 0)// 如果异常发生则返回指定的默认值
    // 【推荐】参数1:异常类型,参数2:正常返回的值,参数3:异常发生返回的值
    val resultWithDefaultValue: Int = failAsValue(classOf[ArithmeticException])(10 / 0)(-1)
    

三、类 型信息处理

classOf[] 提取类型信息
isInstanceOf[] 类型判断
asInstanceOf[] 类型转换

scala">// Text类 
case class Text(author:String,title:String,price:Float)
// TextSon类
class TextSon(level:String,override val author:String,override val title:String,override val price:Float)
extends Text(author, title, price)		// 继承Text类
{val _level:String = leveloverride def toString() = s"TextSon{${super.toString}, ${_level}}"
}
scala">// 提取类型信息
val ci: Class[Text] = classOf[Text]val obj:Text = new TextSon("MAX", "张三", "xxx论文", 86.32f)// 类型判断,判断obj是否为TextSon 类型
val isIns: Boolean = obj.isInstanceOf[TextSon]		// true// 类型转换:转换不当会导致 ClassCastException
val son: TextSon = obj.asInstanceOf[TextSon]
val son: Option[TextSon] = allCatch.opt(obj.asInstanceOf[TextSon])

http://www.ppmy.cn/devtools/32711.html

相关文章

Colab - Introduction to Object Detection using TensorFlow Hub

Colab - Introduction to Object Detection using TensorFlow Hub 1. 源由2. TensorFlow Hub3. 目标检测3.1 举例 - EfficientDet/D4 COCO 20173.2 下载示例图像3.2.1 显示部分样本3.2.2 定义一个将类别ID映射到类别名称和颜色的字典 3.3 加载模型3.4 单张照片执行推理3.4.1 推…

[入门] Unity Shader前置知识(5) —— 向量的运算

在Unity中,向量无处不在,我想很多人都使用过向量类的内置方法 normalized() 吧,我们都知道该方法是将其向量归一化从而作为一个方向与速度相乘,以达到角色朝任一方向移动时速度都相等的效果,但内部具体是如何将该向量进…

设计模式之数据访问对象模式

在Java编程的浩瀚星海中,有一个模式低调却强大,它像是一位默默无闻的超级英雄,支撑起无数应用的数据脊梁——那就是数据访问对象(DAO, Data Access Object)模式!想象一下,如果你能像操纵魔法一样…

Vue 组件间的数据绑定

在Vue组件中,v-model指令可以用来实现双向数据绑定。它用于将组件的属性和父组件中的数据进行双向绑定,使得当属性的值改变时,父组件中的数据也会相应地改变,并且当父组件中的数据改变时,属性的值也会相应地改变。 目…

第III章-ⅠVue3进阶语法

vue3进阶语法 setup 函数Vue方法计算属性及监听器methods方法 computed计算属性ref函数 watch 监听器Vue的表单绑定v-model实现表单绑定v-model修饰符 setup 函数 Vue 3 引入了组合式 API,其中核心是 setup 函数。这个函数是组件中所有 Composition API 特性的入口…

MySQL8.0版本在CentOS系统安装(2024最新版)

一:MySQL8.0版本在CentOS系统安装 安装 使用yum安装MySQL rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpmrpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023yum install mysql-server安装完成后,启动MySQL并配…

快速了解Django:核心概念解析与实践指南

title: 快速了解Django:核心概念解析与实践指南 date: 2024/5/1 20:31:41 updated: 2024/5/1 20:31:41 categories: 后端开发 tags: Django核心路由系统视图系统ORM管理中间件Web框架登录装饰器 第一章:Django简介 背景和发展历程: Djan…

hadoop学习---基于Hive的教育平台数据仓库分析案例(一)

案例背景: 大数据技术的应用可以从海量的用户行为数据中进行挖掘分析,根据分析结果优化平台的服务质量,最终满足用户的需求。教育大数据分析平台项目就是将大数据技术应用于教育培训领域,为企业经营提供数据支撑。 案例数据产生流…