Kotlin利用Regex如何构建正则表达式详解
作者:厚土火焰山 发布时间:2022-12-25 18:31:10
前言
对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。
其实只是对正则不了解而以,了解了你就会发现,原来就这样啊~~正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,最近在学习kotlin,Kotlin 提供了一个正则表达式类 Regex,下面来一起学习下吧。
Regex 提供了丰富而简单实用的函数。
函数名称 | 功能说明 |
---|---|
matches(input: CharSequence): Boolean | 输入字符串全部匹配 |
containsMatchIn(input: CharSequence): Boolean | 输入字符串至少有一个匹配 |
matchEntire(input: CharSequence): MatchResult? | 输入字符串全部匹配,返回一个匹配结果对象 |
replace(input: CharSequence, replacement: String): String | 把输入字符串中匹配的部分替换成replacement的内容 |
replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String | 把输入字符串中匹配到的值,用函数 transform映射之后的新值替换 |
find(input: CharSequence, startIndex: Int = 0): MatchResult? | 返回输入字符串中第一个匹配的值 |
findAll(input: CharSequence, startIndex: Int = 0): Sequence<MatchResult> | 返回输入字符串中所有匹配的值MatchResult的序列 |
matches
输入的字符串全部匹配“正则表达式”返回 true,否则返回 false。
val r1 = Regex("[a-z]+")
println(r1.matches("ABCdef"))
val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE) //忽略大小写
println(r2.matches("ABCdef"))
val r3 = Regex("[A-Z]+")
println(r3.matches("ABC"))
val r4 = "[A-Z]+".toRegex()
println(r4.matches("ABCDEFXYZ"))
运行结果
false
true
true
true
containsMatchIn
输入的字符串中至少有一个匹配就返回 true,否则就返回 false。
val r5 = Regex("[0-9]+")
println(r5.containsMatchIn("012abdc"))
println(r5.containsMatchIn("JAVAI"))
运行结果
true
false
matchEntire
对字符串全部做比较,都匹配正则表达式返回一个MatcherMatchResult对象,否则返回 null。
val r6 = Regex("[0-9]+")
println(r6.matchEntire("1234567890"))
println(r6.matchEntire("1234567890!"))
println(r6.matchEntire("1234567890")?.value)
当我们使用 MatcherMatchResult 的 value 值来显示匹配结果,由于 matchEntire 函数有可能返回一个 null,所以这里使用了安全调用符号“?”。
运行结果
kotlin.text.MatcherMatchResult@1fb3ebeb
null
1234567890
replace
replace(input: CharSequence, replacement: String): String
输入的字符串匹配的部分替换成 replacement 的内容。
val r7 = Regex("[0-9]+")
println(r7.replace("12345XYZ33", "abcd"))
这个例子是把数字替换成了 abcd。
replace函数
函数签名 replace(input: CharSequence, transform: (MatchResult)->CharSequence): String
它的功能是把输入的字符串中匹配的值,用函数 transform 映射之后的新值进行替换。
val r8 = Regex("[0-9]+")
println(r8.replace("12XYZ9", {(it.value.toInt() * it.value.toInt()).toString()}))
我们可以看到,输入的字符串中有两个数字,一个是 12 在字符串的前部,一个是 9 在字符串的后部。
运行结果
144XYZ81
12 被替换成了 144,9 被替换成了 81。
find函数
返回字符串中第一个匹配的 MatcherMatchResult 对象
val r9 = Regex("[0-9]+")
println(r9.find("123ADPOIW87WEERUU005"))
println(r9.find("123ADPOIW87WEERUU005")?.value)
这段代码,会匹配123,而使用了 value 值的方式显示出的结果,我们更加容易理解。
运行结果
kotlin.text.MatcherMatchResult@1fb3ebeb
123
findAll
返回输入的字符串中所有匹配的值的 MatchResult 序列。
我们可以通过 forEach 循环遍历显示所有匹配结果
val src2 = "电话:010-12345678;传真:010-10171695;备用:010-20141017"
val re2 = """(\d{3}-\d{8})""" //"\\d{3}-\\d{8}"
Regex(re2).findAll(src2).forEach { println(it.value + " 位置:[" + it.range + "]") }
运行结果
010-12345678 位置:[3..14]
010-10171695 位置:[19..30]
010-20141017 位置:[35..46]
来源:http://www.jianshu.com/p/90bfbe35e4c6


猜你喜欢
- 如何在listview中插入图片,相信大家很想知道,下面就为大家分享具体步骤:第一步:在窗体中拖入ListView控件和imageList控
- 一、背景说明由于以前在项目中一直使用sqlmap.xml进行mybatis语句的编写和实现,其xml实现动态更新和查询较为方便,而目前由于技
- 本篇介绍我们如何利用selenium 来操作各种页面元素阅读目录链接(link)输入框 textbox按钮(Button)下拉选择框(Sel
- spring boot executable jar/warspring boot里其实不仅可以直接以 java -jar demo.jar
- 本文实例讲述了java实现清理DNS Cache的方法。分享给大家供大家参考。具体分析如下:一、测试环境OS:Windows7 x64JDK
- 👉实践过程😜常用属性因为Seekbar继承自ProgressBar,所以ProgressBar支持的XML属性SeekBar都适用。【and
- class MyThreadScopeData { // 单例 &nbs
- 本文实例讲述了Android popupWindow弹出窗体实现方法。分享给大家供大家参考,具体如下:1. 建立popupwindow显示的
- 思想利用栈和队列都可以实现树的迭代遍历。递归的写法将这个遍历的过程交给系统的堆栈去实现了,所以思想都是一样的、无非就是插入值的时机不一样。利
- 前言本文章接上一篇文章继续谈一谈condition的一些用法。案例上一篇文章我提的一个需求时导入jedis坐标后才能加载该Bean,否则不加
- 经常坐地铁,却不知道地铁多少条线路?哪个站下车?今天就带领大家熟悉并绘制深圳地铁路线图。WPF在绘制矢量图方面有非常强大的优势,利用WPF可
- 本文实例为大家分享了java实现通过绑定邮箱找回密码功能,供大家参考,具体内容如下1.输入用户名及验证码,验证用户名是否存在(1).生成验证
- 这一篇网络爬虫的实现就要联系上大数据了。在前两篇java实现网络爬虫和heritrix实现网络爬虫的基础上,这一次是要完整的做一次数据的收集
- 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> &nbs
- 定义栈又名堆栈,是一种操作受限的线性表,仅能在表尾进行插入和删除操作。它的特点是先进后出,就好比我们往桶里面放盘子,放的时候都是从下往上一个
- 本文实例为大家分享了java实现学生成绩管理系统的具体代码,供大家参考,具体内容如下/* *@copyright by LzyRa
- 异常是程序运行中发生的错误,异常处理是程序设计的一部分。错误的出现并不总是编写应用程序者的原因,有时候应用程序会因为终端用户的操作发生错误。
- spring profile 多环境配置管理现象 如果在开发时进行一些数据库测试,希望链接到一个测试的数据库,以避免对开发数据
- using System; using System.IO; namespace DelAllLrcFiles { class Progra
- 本文实例讲述了C#使用GDI+创建缩略图的方法,分享给大家供大家参考。具体方法分析如下:C#的Gdi+还是相当好用的。创建缩略图步骤如下:1