Kotlin利用Regex如何构建正则表达式详解
前言
对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。
其实只是对正则不了解而以,了解了你就会发现,原来就这样啊~~正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,最近在学习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的序列 |
matches
输入的字符串全部匹配“正则表达式”返回true,否则返回false。
valr1=Regex("[a-z]+") println(r1.matches("ABCdef")) valr2=Regex("[a-z]+",RegexOption.IGNORE_CASE)//忽略大小写 println(r2.matches("ABCdef")) valr3=Regex("[A-Z]+") println(r3.matches("ABC")) valr4="[A-Z]+".toRegex() println(r4.matches("ABCDEFXYZ"))
运行结果
false true true true
containsMatchIn
输入的字符串中至少有一个匹配就返回true,否则就返回false。
valr5=Regex("[0-9]+") println(r5.containsMatchIn("012abdc")) println(r5.containsMatchIn("JAVAI"))
运行结果
true false
matchEntire
对字符串全部做比较,都匹配正则表达式返回一个MatcherMatchResult对象,否则返回null。
valr6=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的内容。
valr7=Regex("[0-9]+") println(r7.replace("12345XYZ33","abcd"))
这个例子是把数字替换成了abcd。
replace函数
函数签名replace(input:CharSequence,transform:(MatchResult)->CharSequence):String
它的功能是把输入的字符串中匹配的值,用函数transform映射之后的新值进行替换。
valr8=Regex("[0-9]+") println(r8.replace("12XYZ9",{(it.value.toInt()*it.value.toInt()).toString()}))
我们可以看到,输入的字符串中有两个数字,一个是12在字符串的前部,一个是9在字符串的后部。
运行结果
144XYZ81
12被替换成了144,9被替换成了81。
find函数
返回字符串中第一个匹配的MatcherMatchResult对象
valr9=Regex("[0-9]+") println(r9.find("123ADPOIW87WEERUU005")) println(r9.find("123ADPOIW87WEERUU005")?.value)
这段代码,会匹配123,而使用了value值的方式显示出的结果,我们更加容易理解。
运行结果
kotlin.text.MatcherMatchResult@1fb3ebeb 123
findAll
返回输入的字符串中所有匹配的值的MatchResult序列。
我们可以通过forEach循环遍历显示所有匹配结果
valsrc2="电话:010-12345678;传真:010-10171695;备用:010-20141017" valre2="""(\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]
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。