首页 > 其他分享 >大数据之脚踏实地学18--Scala正则表达式的使用

大数据之脚踏实地学18--Scala正则表达式的使用

时间:2022-11-29 19:33:05浏览次数:68  
标签:子串 val Scala -- 18 正则表达式 字符串 替换


前言

在《​​大数据之脚踏实地学17--Scala字符串的清洗​​》一文中我们介绍了Scala语言中常用的字符串处理方法,但这些方法并不是万能的,例如字符串子串的获取,如果目标子串并不在固定的位置,此时切片即将无效;字符串子串的替换,如果目标子串的值不确定,位置也不确定时,便无法基于replace的方法进行替换;字符串的分割,如果分隔符并不是固定的字符,而是某种具有规律的对象,那么普通的split方法也同样无法有效。

所以,对于上面所提到的几种情况,我们在本文将跟大家介绍强大的正则表达式,利用正则表达式便可以轻松地解决各种字符串中常见的难题(正则表达式是描述字符串规律的字符串)。本文内容介绍:

字符串子串的查询
字符串子串的替换
字符串的分割

正如前文所说,正则表达式是描述字符串规律的字符串,那么构成字符串规律的正则符号都有哪些,以及这些符号的含义和用法是怎样的,读者朋友可以前往《​​Python中正则表达式的巧妙使用​​》一文中找到答案,本文就不赘述了。

子串的查询

基于正则表达式完成字符串中子串的查询,可以使用findFisrtIn、findAllIn或findAllMatchIn方法。他们的区别如下:

findFirstIn:查询出满足规律的第一个子串;
findAllIn:查询出满足规律的所有子串;
findAllMatchIn:与findAllIn类似,除此还可以配合()进行组元素的获取;

需要说明的是,在使用正则表达式做字符串相关的处理时,可以通过如下两个方式构造正则表达式:

pattern.r:即在字符串后面加上.r字符,这样原字符串便成了正则表达式;
导入scala.util.matching.Regex函数,通过函数构造正则表达式;

举例

// 查询出所有包含a字母的单词(不区分大小写)val S1 = "Today is Thursday, the weather is good, what about tomorrow?"// 构造正则表达式val pattern1 = "[a-zA-Z]*[aA][a-zA-Z]*".rpattern1.findAllIn(S1).toListOUT:List[String] = List(Today, Thursday, weather, what, about)// 导入函数import scala.util.matching.Regex// 查询出身高信息val S2 = "name:张三,height:178,weight:68 name:李四,height:168,weight:62"// 与Python不同的是,如下需要使用双反斜杠val pattern2 = new Regex("height:(\\d+)")// 利用for...yield将迭代对象中的内容存储到Res变量中val Res = for(i <- pattern2.findAllMatchIn(S2)) yield i.group(1)println(Res.toList)OUT:List(178, 168)

子串的替换

对于字符串子串的替换问题,可以将正则表达式利用在如下两个方法中:
replaceFirstIn:替换满足正则表达式的第一个子串;
replaceAllIn:替换满足正则表达式的所有子串;

举例

// 将字符串中的数字替换为减号val S3 = "现在是2019年4月5日,晚上21点17分"val pattern3 = "\\d+".rpattern3.replaceAllIn(S3,"-")OUT:现在是-年-月-日,晚上-点-分

字符串的分割

字符串分割就更加简单了,只需要将正则表达式跟split函数搭配使用即可。下面通过一个简单的例子加以说明。

举例

// 将字符串按照标点符号切割开val S4 = "学习Scala,是一个漫长的过程。需要系统地学习,加油吧!兄弟。"val pattern4 = new Regex("[,。!]")pattern4.split(S4)OUT:Array[String] = Array(学习Scala, 是一个漫长的过程, 需要系统地学习, 加油吧, 兄弟)

结语

本期的内容就介绍到这里,如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。


标签:子串,val,Scala,--,18,正则表达式,字符串,替换
From: https://blog.51cto.com/u_9205406/5896604

相关文章

  • 计算平均值。输入十个学生的考试成绩计算平均值。(数组实现))
    #include<stdio.h>#defineN10intmain(){ inti; doublea[N],sum=0.0; sum=0.0; printf("请输入成绩:\n"); for(i=0;i<N;i++) scanf("%lf",&a[i]); for(i=0......
  • Git到底是什么?它有哪些功能?
    Git是一个免费的、开源的分布式版本控制系统,可以用于记录一个或者若干个文件内容的变化,方便查阅或者修改。Git官网:​​https://git-scm.com/​​1、常见的版本控制系统1.1、......
  • 测试索引
    准备#1.准备表createtables1(idint,namevarchar(20),genderchar(6),emailvarchar(50));#2.创建存储过程,实现批量插入记录delimiter$$#声明存储过程的......
  • 每日食词—day010
    insteadadv.代替、改为、反而.enterprisen.企业、企业版、企业号.setTimeoutn.定时器、计时器vendorn.供应商、厂商、小贩、卖方.cachen. v.缓......
  • 实验五
    实验四pets.hpp1#pragmaonce2#include<iostream>3#include<string>4usingnamespacestd;5classMachinePets{6public:7MachinePets()=defau......
  • Bootstrap_全局CSs样式_按钮&图片和Bootstrap_全局CSS样式2_表格&表单
    Bootstrap_全局CSs样式_按钮&图片:全局css样式:按钮:<aclass="btnbtn-default"href="#">Link</a>图片:<!--图片--><imgsrc="img/banner_1.jpg"class="......
  • rfc3442-classless-static-routes 字段含义
    参考文档:https://www.nuomiphp.com/serverfault/zh/60480e758726d95932321906.html#dhcp配置optionrfc3442-classless-static-routescode121=arrayofinteger......
  • 2022 ICPC 济南站 L 题题解
    题意给定一棵\(n\)个点有边权的无根树,有\(q\)次询问,每次给定\(l,r\),求\[\min_{l\leu<v\ler}\{\operatorname{dist}(u,v)\}.\]数据范围:\(1\len\le2\times10^5......
  • 归并排序模板
    归并排序模板归并排序要点:分治的思想确定分界点mid=(l+r)/2;递归排序left,right归并——合二为一(归并排序的核心)#include<bits/stdc++.h>usingnamespac......
  • Bootstrap_组件_导航条&分页条和Bootstrap_插件_轮播图
    Bootstrap_组件_导航条&分页条:组件: 导航条:导航条是在您的应用或网站中作为导航页头的响应式基础组件。它们在移动设备上可以折叠(并且可开可关),且在视口(viewpor......