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
猜你喜欢
- 完整代码已上传到GitHub。Web端体验地址:http://47.116.72.33/(只剩一个月有效期)apk下载地址:https://
- 前言Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧密集成,可以很方便地在 Java 项目中使用。Groovy 有着简洁的
- 前言:最近终于用上了高性能的测试机(54C96G * 3),相较之前的单机性能提升了三倍,数量提升了三倍,更关键的宽带提单机升了30倍不止,
- 本文实例讲述了DevExpress设置饼状图的Lable位置的方法。分享给大家供大家参考。具体实现方法如下:关键代码如下:/// <s
- 0.关于AOP面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也
- 前言在开始本文之前要说明以下,首先我是一个初学springmvc,抱着去加深印象的目的去整理相关springmvc4的相关注解,同时也希望给
- 一.摘要emmmm..对springmvc不太熟练的情况下,如果不出意外的话,项目启动后出现404页面是很烦人。在这里,我记录一下可能会导致
- 1、错误的解决方案1.1、 先更新数据库,再删除缓存若数据库更新成功,删除缓存操作失败,则此后读到的都是缓存中过期的数据,造成不一致问题。1
- 本文实例为大家分享了AsyncTask异步类实现网页内容放大缩小的详细代码,供大家参考,具体内容如下WebActivity.java:pac
- 字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素。字典也称为映射或散列表。字典的主要特性是能根据键快速查找值。也可以自由添加
- 这篇文章主要介绍了Springboot如何设置静态资源缓存一年,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 实例如下:static void testLock1(){final AtomicInteger waitCount = new Atomi
- 一.理论准备流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行,设备可以是文件、网络、
- 前言Set 表示由无重复对象组成的集合,也是集合框架中重要的一种集合类型,直接扩展自 Collection 接口。在一个 Set 中,不能有
- 如下所示: /** * 判断某个界面是否在前台 * * @param context
- 文件流输出文件名中文不显示response返回文件流 用response.setHeader(“Content-disp
- 目录引言SqlSessionFactory不使用 XML 构建 SqlSessionFactorySqlSessionFactoryBuil
- Apache提供的commons-fileupload jar包实现文件上传确实很简单,最近要用Servlet/JSP做一个图片上传功能,在
- 先看一下java线程运行时各个阶段的运行状态线程是进程中的一个实体,是被系 * 立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运
- Java 切割字符串的几种方式//以data 为案例参数。String data = "2019-01-