登录 立即注册
安币:

楼主: 莫应有道

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

[复制链接]

497

主题

968

帖子

1054

安币

手工艺人

发表于 2018-3-12 11:54:21 | 显示全部楼层 |阅读模式

            

        前言

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

        其实只是对正则不了解而以,了解了你就会发现,原来就这样啊~~正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,最近在学习kotlin,kotlin 提供了一个正则表达式类 regex,下面来一起学习下吧。

        regex 提供了丰富而简单实用的函数。

        

  
   
      函数名称
      功能说明
   
  
  
   
      matches(input: charsequence): boolean
      输入字符串全部匹配
   
   
      containsmatchin(input: charsequence): boolean
      输入字符串至少有一个匹配
   
   
      matchentire(input: charsequence): matchresult

[Java] 查看源文件 复制代码
 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"))

        运行结果

[Java] 查看源文件 复制代码
false
true
true
true

        containsmatchin

        输入的字符串中至少有一个匹配就返回 true,否则就返回 false。

[Java] 查看源文件 复制代码
 val r5 = regex("[0-9]+")
 println(r5.containsmatchin("012abdc"))
 println(r5.containsmatchin("javai"))

        运行结果

[Java] 查看源文件 复制代码
true
false

        matchentire

        对字符串全部做比较,都匹配正则表达式返回一个matchermatchresult对象,否则返回 null。

[Java] 查看源文件 复制代码
 val r6 = regex("[0-9]+")
 println(r6.matchentire("1234567890"))
 println(r6.matchentire("1234567890!"))
 println(r6.matchentire("1234567890")

        当我们使用 matchermatchresult 的 value 值来显示匹配结果,由于 matchentire 函数有可能返回一个 null,所以这里使用了安全调用符号“?”。

        运行结果

[Java] 查看源文件 复制代码
kotlin.text.matchermatchresult@1fb3ebeb
null
1234567890

        replace

        replace(input: charsequence, replacement: string): string

        输入的字符串匹配的部分替换成 replacement 的内容。

[Java] 查看源文件 复制代码
 val r7 = regex("[0-9]+")
 println(r7.replace("12345xyz33", "abcd"))

        这个例子是把数字替换成了 abcd。

        replace函数

        函数签名 replace(input: charsequence, transform: (matchresult)->charsequence): string

        它的功能是把输入的字符串中匹配的值,用函数 transform 映射之后的新值进行替换。

[Java] 查看源文件 复制代码
 val r8 = regex("[0-9]+")
 println(r8.replace("12xyz9", {(it.value.toint() * it.value.toint()).tostring()}))

        我们可以看到,输入的字符串中有两个数字,一个是 12 在字符串的前部,一个是 9 在字符串的后部。

        运行结果

[Java] 查看源文件 复制代码
144xyz81

        12 被替换成了 144,9 被替换成了 81。

        find函数

        返回字符串中第一个匹配的 matchermatchresult 对象

[Java] 查看源文件 复制代码
 val r9 = regex("[0-9]+")
 println(r9.find("123adpoiw87weeruu005"))
 println(r9.find("123adpoiw87weeruu005")

        这段代码,会匹配123,而使用了 value 值的方式显示出的结果,我们更加容易理解。

        运行结果

[Java] 查看源文件 复制代码
kotlin.text.matchermatchresult@1fb3ebeb
123

        findall

        返回输入的字符串中所有匹配的值的 matchresult 序列。

        我们可以通过 foreach 循环遍历显示所有匹配结果

[Java] 查看源文件 复制代码
 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 + "]") }

        运行结果

[Java] 查看源文件 复制代码
010-12345678 位置:[3..14]
010-10171695 位置:[19..30]
010-20141017 位置:[35..46]

        总结



        

10

主题

9619

帖子

868

安币

代码手工艺人

Rank: 4

发表于 2018-3-12 17:13:46 | 显示全部楼层
支持楼主,支持安卓巴士!

579

主题

1049

帖子

3282

安币

手工艺人

发表于 2018-3-13 01:52:59 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

27

主题

9473

帖子

1888

安币

Android大神

Rank: 6Rank: 6

发表于 2018-3-13 10:46:07 | 显示全部楼层
感谢大神~

428

主题

871

帖子

1917

安币

手工艺人

发表于 2018-3-14 00:04:39 | 显示全部楼层
不错不错,楼主辛苦了。。。

8

主题

9066

帖子

3560

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2018-3-14 23:14:13 | 显示全部楼层
每次我都积极回帖的,想要安币~

758

主题

1202

帖子

1890

安币

手工艺人

发表于 2018-3-16 06:16:52 | 显示全部楼层
感谢分享,楼主V5~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表