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

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

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

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

一、正则

1、匹配

  1. 简单匹配

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

    // 将字符串 content 中的数字和逗号分隔的数字序列解析成一个三元组,如果字符串不符合指定格式则返回一个包含三个 "INVALID" 字符串的三元组。
    import scala.util.matching.Regex
    
    val 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 将原始字符串中所有匹配到的文本都替换为指定的替换字符串,并返回替换后的新字符串。

使用样例

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、分割

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

4、分组

分组:必须添加 ()
findFirstMatchIn
findAllMatchIn

样例

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

代码

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...

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

    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[] 类型转换

// 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 = level
    override def toString() = s"TextSon{${super.toString}, ${_level}}"
}
// 提取类型信息
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.mfbz.cn/a/592376.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

短视频矩阵系统ai剪辑 矩阵 文案 无人直播四合一功能核心独家源头saas开发

抖去推矩阵AI小程序是一款针对短视频平台的智能创作和运营工具,它具有以下功能特点: 1.批量视频生成:抖去推可以在短时间内生成大量视频,帮助商家快速制作出适合在短视频平台上推广的内容 2.全行业覆盖:适用于多个行业…

环形链表面试题详解

A. 环形链表1 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…

每日OJ题_贪心算法二⑦_力扣942. 增减字符串匹配

目录 力扣942. 增减字符串匹配 解析代码 力扣942. 增减字符串匹配 942. 增减字符串匹配 难度 简单 由范围 [0,n] 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s &#xff0c;其中: 如果 perm[i] < perm[i 1] &#xff0c;那么 s[i] I 如果 …

奈氏准则和香农定理

一、奈奎斯特和香农 哈里奈奎斯特&#xff08;Harry Nyquist&#xff09;(左) 克劳德艾尔伍德香农&#xff08;Claude Elwood Shannon&#xff09;(右) 我们应该在心里记住他们&#xff0c;记住所有为人类伟大事业做出贡献的人&#xff0c;因为他们我们的生活变得越来越精彩&…

计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设

安顺学院本科毕业论文(设计)题目申请表 院别&#xff1a;数学与计算机科学 专业&#xff1a;数据科学与大数据 时间&#xff1a;2022年 5月26日 题 目 情 况 题目名称 基于hive数据仓库的考研信息离线分析系统的设计与实现 学生姓名 杨娣荧 学号 201903144042 …

【Hadoop】--基于hadoop和hive实现聊天数据统计分析,构建聊天数据分析报表[17]

目录 一、需求分析 1、背景介绍 2、目标 3、需求 4、数据内容 5、建库建表 二、ETL数据清洗 1、数据问题 2、需求 3、实现 4、扩展概念&#xff1a;ETL 三、指标计算 1、指标1&#xff1a;统计今日消息总量 2、指标2&#xff1a;统计每小时消息量、发送量和接收用…

shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)

目录 一、GeoJSON是什么 二、GeoJSON的结构组成 2.1、点&#xff08;Point&#xff09;数据示例 2.2、线&#xff08;LineString&#xff09;数据示例 2.3、面&#xff08;Polygon&#xff09;数据示例 2.4、特征&#xff08;Feature&#xff09;数据示例 2.5、特征集合&…

Leetcode—1056. 易混淆数【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—1056. 易混淆数 &#x1f4a9;山实现代码 class Solution { public:bool confusingNumber(int n) {int arr[10] {0};int notNum 0;int arr2[12] {0};int size 0;while(n) {int x n % 10;arr[x] 1;arr2[size] x;if(…

自动化测试适用场景

日常大家都用自动化去写测试脚本。但是自动化可不仅仅可以工作写脚本&#xff0c;还可以应用到如下领域&#xff1a; 1. 自动化测试脚本&#xff1a;自动化测试是软件测试 领域中最常见的自动化应用领域。它可以通过 自动化测试工具和脚本来自动化执行测试用例 &#xff0c…

水仙花数问题

问题描述&#xff1a; 求出0&#xff5e;100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#xff1d;1^3&#xff0b;5^3&#xff0b;3^3&#xff0c;则153是一个“水仙花数”。 #in…

VS Code 保存+格式化代码

在 VSCode 中&#xff0c;使用 Ctrl S 快捷键直接保存并格式化代码&#xff1a; 打开 VSCode 的设置界面&#xff1a;File -> Preferences -> Settings在设置界面搜索框中输入“format on save”&#xff0c;勾选“Editor: Format On Save”选项&#xff0c;表示在保存…

Java 【数据结构】常见排序算法实用详解(下) 冒泡排序/快速排序/归并排序/非基于比较排序【贤者的庇护】

登神长阶 上古神器-常见排序算法 冒泡排序/快速排序/归并排序/非基于比较排序 &#x1f4b0;一.前言 为保障知识获取的可读性&#xff0c;以及连贯性&#xff0c;再开始可以适当的重新温习前文内容 &#xff1a;Java 【数据结构】常见排序算法实用详解&#xff08;上&#xf…

TWS 蓝牙耳机 ESD EOS保护方案

1. TWS 蓝牙耳机 TWS&#xff08;True Wireless Stereo&#xff09;蓝牙耳机是指没有传统连接线的完全无线耳机&#xff0c;通常由两个分别放置在耳朵中的独立耳机组成&#xff0c;提供立体声音效。这类耳机在近年来越来越受欢迎&#xff0c;因为它们提供了更自由、更便捷的音…

有限单元法-编程与软件应用(崔济东、沈雪龙)【PDF下载】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

MLP手写数字识别(3)-使用tf.data.Dataset模块制作模型输入(tensorflow)

1、tensorflow版本查看 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、MNIST数据集下载与预处理 (train_images,train_labels),(test_images,test_labels) tf.keras.datasets.mnist.load_data()…

JSON.toJSONString() 输出 “$ref“:“$[0]“问题解决及原因分析

一、背景 在构建一个公共的批处理方法类的时候&#xff0c;在测试输出的时候&#xff0c;打印了" r e f " : " ref":" ref":"[0][0]"的内容&#xff0c;这让我比较疑惑。不由得继续了下去… 二、问题分析 首先&#xff0c;我们需要…

《苍穹外卖》前端课程知识点记录

一、VUE基础知识 基于脚手架创建前端工程 1. 环境要求 安装node.js&#xff1a;Node.js安装与配置&#xff08;详细步骤&#xff09;_nodejs安装及环境配置-CSDN博客查看node和npm的版本号 安装Vue CLI&#xff1a;Vue.js安装与创建默认项目&#xff08;详细步骤&#xff09;…

DHCPv4_CLIENT_ALLOCATING_06: 发送DHCPDISCOVER消息 - 在没有收到DHCPOFFER消息时超时并重新发送

测试目的&#xff1a; 验证DOIP客户端在未收到DHCP服务器的DHCOFFER消息时&#xff0c;能够正确地超时并重传DHCPDISCOVER消息。 描述&#xff1a; 在DOIP网络环境中&#xff0c;当客户端&#xff08;DUT&#xff09;启动并尝试获取IP地址时&#xff0c;它首先发送DHCPDISCO…

IoTDB 入门教程 基础篇⑨——TsFile导入导出工具

文章目录 一、前文二、准备2.1 准备导出服务器2.2 准备导入服务器 三、导出3.1 导出命令3.2 执行命令3.3 tsfile文件 四、导入4.1 上传tsfile文件4.2 导入命令4.3 执行命令 五、查询六、参考 一、前文 IoTDB入门教程——导读 数据库备份与迁移是数据库运维中的核心任务&#xf…
最新文章