Scala学习笔记15: 文件和正则表达式

目录

    • 第十五章 文件和正则表达式
      • 1- 读取行
      • 2- 从URL或者其它源读取
      • 3- 写入文本文件
      • 4- 序列化
      • 5- 正则表达式
      • 6- 正则表达式验证输入数据格式
      • end

第十五章 文件和正则表达式

1- 读取行

在Scala中读取文件中的行可以通过不同的方法实现 ;

一种常见的方法是使用 scala.io.Source 对象来逐行读取文件内容 ;

示例 :

import scala.io.Sourceobject FileReadingLinesExample {def main(args: Array[String]): Unit = {val fileName = "src/main/resources/test.txt"try {val source = Source.fromFile(fileName)val lines = source.getLines().toListsource.close()println("文中的行: ")lines.foreach(println)} catch {case e: Exception => println("文件读取错误: " + e.getMessage)}}
}
# 输出
文中的行: 
《登雀鹤楼》
唐.王之涣
白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼。

在这个示例中, 我首先导入了 scala.io.Source 类 ;

然后, 我们指定要读取的文件名, 并使用 Source.fromFile(fileName) 创建一个 Source 对象 ;

接着, 我们使用 getLines() 方法逐行读取文件内容, 并将每行存储在一个列表中 ;

最后, 我们关闭文件流并打印出读取的所有行 .

注意, 这只是一个简单的示例, 实际应用中可能需要更多的错误处理和资源管理 ;

确保文件存在并具有适当的读取权限 ;

你可以根据需要进一步扩展和优化这段代码 .

2- 从URL或者其它源读取

在Scala中, 你可以使用 scala.io.Source 类来从URL或其他来源读取文件内容 ;

示例 :

import scala.io.Source
import java.net.URLobject URLReadingExample {def main(args: Array[String]): Unit = {val url = new URL("https://raw.githubusercontent.com/dpx0110/files/main/poem.txt")try {val source = Source.fromURL(url)val content = source.mkStringsource.close()println("从URL读取的文件内容: ")println(content)} catch {case e: Exception => println(s"Error reading URL: ${e.getMessage}")}}
}
  • 在这个示例中, 我们导入了 scala.io.Source 类和 java.net.URL 类 ;
  • 然后, 我们创建一个 URL 对象, 指定要读取的URL地址 ;
  • 接着, 我们使用Source.fromURL(url) 方法从URL读取文件内容, 并将其存储为字符串 ;
  • 最后, 我们关闭文件流并打印出读取的内容 .
// 其它源读取
val source1 = Source.fromString("hello world! ")
val source2 = Source.stdin
...

请确保URL地址有效并具有适当的访问权限 ;

根据实际情况修改URL地址, 以适应你的文件读取需求 ;

这段代码可以帮助你从URL或其他来源读取文件内容 .

3- 写入文本文件

在Scala中写入文本文件, 可以使用多种方法, 一下是几种常见方式 :

**1. 使用 java.io.PrintWriter **

这是最直接的方式, 利用 Java 的 PrintWriter 类写入数据到文件 ;

import java.io.PrintWriterobject WriteToFile {def main(args: Array[String]): Unit = {val filePath = "src/main/resources/poem1.txt"val writer = new PrintWriter(filePath)try {writer.println("《题西林壁》")writer.println("宋.苏轼")writer.println("横看成岭侧成峰,")writer.println("远近高低各不同。")writer.println("不识庐山真面目,")writer.println("只缘身在此山中。")} finally {writer.close()}}
}
《题西林壁》
宋.苏轼
横看成岭侧成峰,
远近高低各不同。
不识庐山真面目,
只缘身在此山中。

2. 使用 java.io.FileWriterjava.io.BufferedWriter

这种方式更注重效率, BufferedWriter 可以提高写入效率, 尤其在处理大量数据时 ;

import java.io.{BufferedWriter, FileWriter}object WriteToFile {def main(args: Array[String]): Unit = {val filePath = "src/main/resources/poem2.txt"val writer = new FileWriter(filePath)val bufferedWriter = new BufferedWriter(writer)try {bufferedWriter.write("《题西林壁》\n") // 须手动添加换行符bufferedWriter.write("宋.苏轼\n")bufferedWriter.write("横看成岭侧成峰,\n")bufferedWriter.write("远近高低各不同。\n")bufferedWriter.write("不识庐山真面目,\n")bufferedWriter.write("只缘身在此山中。\n")} finally {bufferedWriter.close()}}
}
《题西林壁》
宋.苏轼
横看成岭侧成峰,
远近高低各不同。
不识庐山真面目,
只缘身在此山中。

4- 序列化

在分布式系统、大数据处理以及需要将对象状态保存到磁盘的场景中, 序列化扮演着至关重要的角色 ;

Scala作为一门运行于Java虚拟机上的语言, 自然也需要处理对象的序列化和反序列化问题 ;

Scala本身没有提供原生的序列化机制, 而是依赖于Java的序列化机制或第三方库来实现 ;

1. 使用Java序列化

最直接的方式是使用Java自带的序列化机制 ;

你只需要让你的类继承 java.io.Serializzble 接口 , 并添加 serialVersionUID 即可 ;

    // 序列化 和 反序列化import java.io._@SerialVersionUID(100L)class Person(val name: String, val age: Int) extends Serializable {override def toString: String = s"Person(name=$name, age=$age)"}// 序列化val person = new Person("Tom", 18)val outputStream = new FileOutputStream("person.ser")val objectOutputStream = new ObjectOutputStream(outputStream)objectOutputStream.writeObject(person)objectOutputStream.close()// 反序列化val inputStream = new FileInputStream("person.ser")val objectInputStream = new ObjectInputStream(inputStream)val loadedPerson = objectInputStream.readObject().asInstanceOf[Person]objectInputStream.close()println(loadedPerson) // Output: Person(name=Tom, age=18)println(loadedPerson.getClass) // Output: class org.puture.scala.MyFiles$Person$1println(loadedPerson.name) // Output: Tomprintln(loadedPerson.age) // Output: 18
  • 优点: 简单直接, 开箱即用
  • 缺点:
    • 只能序列化实现了 java.io.Serializable 接口的类
    • 序列化后的数据格式与Java绑定, 不够灵活
    • 性能相对较低

2. 使用第三方库

为了克服Java序列化的缺点, Scala社区涌现出许多优秀的第三方序列化库, 例如:

  • Json库:
    • uPickle: 专注于速度和简洁性, 使用宏生成高效的序列化代码 ;
    • Circe: 类型安全, 功能强大, 支持多种数据格式 ;
    • Play Json: Play框架的一部分, 易于使用, 适用于Web应用程序 ;
  • 其他库:
    • Kryo: 高性能序列化库, 适用于需要极致速度的场景 ;
    • Chill: Twitter开发的序列化库, 支持多种数据格式, 包括Kryo和Json .

选择合适的序列化方式

选择哪种序列化方式取决于你的具体要求 :

  • 简单项目: 如果你的项目比较简单, 对性能要求不高, 可以使用Java序列化或者uPickle ;
  • **Web应用程序: ** 可以考虑使用Play Json, 它与Play框架集成良好 ;
  • **高性能需求: ** 如果你的项目对性能要求很高, 可以考虑使用Kryo或者Chill ;
  • **类型安全: ** 如果需要类型安全的序列化, 建议使用 Circe等库 ;

总而言之, Scala提供了多种方式类处理对象的序列化和反序列化, 你需要根据项目的具体情况选择合适的方式 .

5- 正则表达式

Scala中的正则表达式使用与 Java相同的语法, 但它提供了更简洁、更强大的方式来匹配和操作文本 ;

1. 基本语法

Scala中的正则表达式使用 r 字符串字面量来定义 ; 例如 :

val regex = "hello".r

这个正则表达式将匹配字符串 “hello” ;

2. 常用元字符

  • . : 匹配任意单个字符 ;
  • * : 匹配前面的字符零次或多次 ;
  • + : 匹配前面的字符一次或多次 ;
  • ? : 匹配前面的字符零次或一次 ;
  • | : 匹配左边或右边的表达式 ;
  • [] : 匹配方括号内的任意字符 ;
  • [^...] : 匹配不在方括号内的任意字符 ;
  • \d : 匹配数字 ;
  • \s : 匹配空白字符 ;
  • \w : 匹配字母、数字或才划线 ;
  • \b : 匹配单词边界 ;
  • ^ : 匹配字符串开头 ;
  • $ : 匹配字符串结尾 ;

3. 匹配文本

可以使用 findAllIn 方法来查找匹配的文本 ;

    val text = "Hello, world!"val regex = "Hello".rval matches = regex.findAllIn(text)matches.foreach(println) // 输出: Hello	

4. 替换文本

可以使用 replaceAllIn 方法来替换匹配的文本 ;

    val text = "Hello, world!"val regex = "world".rval replaced = regex.replaceAllIn(text, "Scala")println(replaced) // Output: Hello, Scala!

5. 分组

可以使用 () 来分组正则表达式, 并通过 group 方法获取匹配的子字符串 ;

    val text = "The quick brown fox jumps over the lazy dog."val regex = "(.+) (.+) (.+)".rval matches = regex.findAllMatchIn(text)matches.foreach(m => {println("Group 1: " + m.group(1)) // Group 1: The quick brown fox jumps over theprintln("Group 2: " + m.group(2)) // Group 2: lazyprintln("Group 3: " + m.group(3)) // Group 3: dog.})

6. 捕获组

可以使用 find 方法来查找第一个匹配的文本, 并使用 group 方法获取捕获组的内容 ;

    val text = "The quick brown fox jumps over the lazy dog."val regex = "(\\w+) (\\w+)".rval matches = regex.findPrefixOf(text)println(matches) // Output: Some(The quick)if (matches.isDefined) {val m = matches.getprintln(m) // Output: The quick}

7. 注意事项

  • 正则表达式语法较为复杂, 需要仔细理解才能灵活运用 ;
  • 正则表达式匹配效率可能较低, 特别是复杂的表达式, 需要谨慎使用 ;
  • Scala 中的正则表达式支持Java的正则表达式语法, 可以参考Java文档了解更多细节 ;

总结

Scala中的正则表达式功能强大, 能够满足各种文本匹配和处理的需求 ;

希望以上介绍能够帮助你更好的理解Scala中的正则表达式 .

6- 正则表达式验证输入数据格式

在Scala中, 你可以使用正则表达式来验证输入数据的格式, 例如邮箱地址、手机号等 ;

1. 准备工作

首先, 需要定义一个正则表达式, 用来匹配目标格式的数据 ;

例如:

  • 邮箱地址: ^.+@.+\\..+$
  • 手机号: ^1[3-9]\\d{9}$

2. 代码示例

object DataValidation {def main(args: Array[String]): Unit = {val emailRegex = "^.+@.+\\..+$".rval phoneRegex = "^1[3-9]\\d{9}$".r// 键盘输入println("请输入邮箱地址:")val email = scala.io.StdIn.readLine()println("请输入手机号:")val phone = scala.io.StdIn.readLine()// 验证邮箱地址if (emailRegex.findFirstIn(email).isDefined) {println("邮箱地址格式正确")} else {println("邮箱地址格式错误")}// 验证手机号if (phoneRegex.findFirstIn(phone).isDefined) {println("手机号格式正确")} else {println("手机号格式错误")}}
}
请输入邮箱地址:
6666@gmail.com
请输入手机号:
16688889999
邮箱地址格式正确
手机号格式正确Process finished with exit code 0请输入邮箱地址:
123.34@gamil.com
请输入手机号:
166888899996
邮箱地址格式正确
手机号格式错误Process finished with exit code 0

3. 解释

  • Regex 类是Scala用于表示正则表达式的类 ;
  • findFirstIn 方法用于查找字符串中第一个匹配正则表达式的字符串, 如果找到则返回 Some(匹配的自字符串) , 否则返回 None ;
  • isDefined 方法用于判断 Option 类型的值是否为空 ;

4. 其它验证方法

除了使用 findFirstIn 方法, 还可以使用以下方法来验证数据格式 :

  • matches 方法: 判断整个字符串是否匹配正则表达式 ;
  • replaceAllIn 方法: 将字符串中所有匹配正则表达式的部分替换成其他字符串 ;

5. 注意事项

  • 正则表达式语法比较复杂, 需要仔细学习和理解 ;
  • 使用正则表达式进行数据格式验证只能保证数据符合预期的格式, 无法保证数据的有效性 ;
  • 例如: 验证有序地址格式, 并不能保证这个邮箱地址真实存在 ;

6. 扩展

除了验证邮箱地址和手机号, 还可以使用正则表达式来验证其他格式的数据, 例如:

  • 日期格式
  • 身份证号码
  • 邮政编码
  • URL地址

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/41209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s-第三节-工作负载

工作负载分类 ReplicaSet Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更新的好处是不会丢失历史变更。所以Deployment控制器不直接管理Pod对象&#x…

新加坡很火的slots游戏代投Facebook广告新流量趋势

新加坡很火的slots游戏代投Facebook广告新流量趋势 在新加坡这片充满活力的土地上,Slots游戏以其独特的魅力和吸引力,迅速成为了许多玩家的心头好。而Facebook,作为全球最大的社交媒体平台之一,为Slots游戏的推广提供了得天独厚的…

三、数据库系统(考点篇)

1、三级模式一两级映像 内模式:管理如何存储物理的 数据 ,对数据的存储方式、优化、存放等。 模式:又称为概念模式, 就是我们通常使用的表这个级别 ,根据应用、需求将物理数据划分成一 张张表。 外模式:…

【算法:贪心】:贪心算法介绍+基础题(四个步骤);柠檬水找零(交换论证法)

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 前言: 暑假马上就要留校学习算法了,现在先学习一下基本的算法打打基础。本篇要讲的是…

深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手

我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机、甚至整个城市。现在,想象一下如果有一个数字世界的乐高,我们可以用这样的“积木”来构建智能程序,这些程序能够阅读、理解和撰写文本&#xf…

基于DMAIC降低气缸体水套芯磕碰伤率

在制造业的激烈竞争中,产品质量的提升一直是企业追求的目标。气缸体作为汽车发动机的核心部件,其生产过程中的质量控制尤为重要。今天,深圳天行健企业管理咨询公司就来分享一下如何运用DMAIC(定义、测量、分析、改进、控制&#x…

基于java+springboot+vue实现的电影院购票系统(文末源码+Lw)274

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装电影院购票系统软件来发挥其高效地信息处理的作用&#xf…

光电液位传感器在宠物洗澡机的应用

光电液位传感器在宠物洗澡机中的应用,为洗澡机的智能化管理提供了重要支持和保障。这种先进的传感技术不仅提升了设备的操作便捷性,还大幅度提高了洗澡过程的安全性和效率。 宠物洗澡机作为宠物护理的重要设备,其水位的控制至关重要。光电液…

C语言 do while 循环语句练习 中

练习: 4.编写代码,演示多个字符从两端移动,向中间汇聚 // 编写代码,演示多个字符从两端移动,向中间汇聚 //welcome to china!!! //w ! //we !! //wel !!! //.... //welco…

【图卷积网络】GCN基础原理简单python实现

基础原理讲解 应用路径 卷积网络最经典的就是CNN,其 可以提取图片中的有效信息,而生活中存在大量拓扑结构的数据。图卷积网络主要特点就是在于其输入数据是图结构数据,即 G ( V , E ) G(V,E) G(V,E),其中V是节点,E是…

graphviz 报错: No module named ‘graphviz‘

在使用完命令 conda install graphviz 后此时已经显示已安装,但仍然报错! 我是使用以下命令解决的。 conda install python-graphviz

Python爬虫教程第0篇-写在前面

为什么写这个系列 最近开发了个Python爬虫的脚本,去抢一个名额,结果是程序失败了,中间有各种原因,终究还是准备不足的问题。我想失败的经验或许也可贵,便总结一下当初从0开始学Python,一步步去写Python脚本…

如何 提升需求确定性

提升需求确定性是确保项目成功的关键之一。以下是一些方法和策略可以帮助你提升需求的确定性: 积极的利益相关者参与: 确保所有关键利益相关者(包括最终用户、业务所有者、开发团队等)参与需求收集和确认过程。他们的参与可以提供…

宏队列和微队列

promise学习 js的宏队列和微队列说明微任务(Microtasks)宏任务(Macrotasks)执行顺序 案例案例2注意:案例3案例4 js的宏队列和微队列 说明 JS中用来存储待执行回调函数的队列包含2个不同特定的列队宏列队: 用来保存待执…

除了 Python 之外,程序员常用的编程语言还有哪些?它们的优缺点分别是什么?

JavaScript 优点: 应用广泛,是web前端开发的主要语言。上手相对容易,学习资源丰富。拥有庞大的社区和生态系统,各种库和框架非常丰富。缺点: 动态类型语言,代码容易出错,调试相对困难。不同浏览器对JavaScript的解释可…

【docker nvidia/cuda】ubuntu20.04安装docker踩坑记录

docker nvidia 1.遇到这个错误,直接上魔法(科学上网) OpenSSL SSL_connect: Could not connect to nvidia.github.io:443 这个error是运行 NVIDIA官方docker安装教程 第一个 curl 命令是遇到的 2. apt-get 更新 sudo apt update遇到 error https://download.do…

openEuler系统之使用Keepalived+Nginx部署高可用Web集群

Linux系统之使用Keepalived+Nginx部署高可用Web集群 一、本次实践介绍1.1 本次实践简介1.2 本次实践环境规划二、keepalived介绍2.1 keepalived简介2.2 keepalived主要特点和功能2.3 使用场景三、Keepalived和Nginx介绍3.1 Nginx简介3.2 Nginx特点四、master节点安装nginx4.1 安…

平面设计考试题

考试题 缺省页作用:缓减缺省页带来的负面情绪,增加s用户与产品的粘度,提升产品的用户体验 网站基本类型 c端b端 c端 面向用户和消费者的 门户站 产品网站 企业网站 电商网站 专题页面 游戏网站 视频网站 h5移动端 四大门户网站:新浪&…

104. 建造最大岛屿

题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你最多可以将矩阵中的一格水变为一块陆地,在执行了此操作之后,矩阵中最大的岛屿面积是多少。岛屿面积的计算方式为组成岛屿的陆地的…

安卓自动化的一些API

def run_adb_command():pass创建指定大小的文件 def create_random_file(file_path: str, file_size: int 1024):# 1M 1024 * 1024if file_path.endswith("/"):raise Exception(f"请输入正确的文件路径:{file_path}")file_name file_path.rsplit("…