Kotlin利用Regex如何构建正则表达式详解

所属分类: 软件编程 / Android 阅读数: 53
收藏 0 赞 0 分享

前言

对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。

其实只是对正则不了解而以,了解了你就会发现,原来就这样啊~~正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,最近在学习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]

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多