Kotlin 提供了一個(gè)正則表達(dá)式類 Regex跪妥。
Regex 提供了豐富而簡(jiǎn)單實(shí)用的函數(shù)席楚。
函數(shù)名稱 | 功能說(shuō)明 |
---|---|
matches(input: CharSequence): Boolean | 輸入字符串全部匹配 |
containsMatchIn(input: CharSequence): Boolean | 輸入字符串至少有一個(gè)匹配 |
matchEntire(input: CharSequence): MatchResult? | 輸入字符串全部匹配,返回一個(gè)匹配結(jié)果對(duì)象 |
replace(input: CharSequence, replacement: String): String | 把輸入字符串中匹配的部分替換成replacement的內(nèi)容 |
replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String | 把輸入字符串中匹配到的值,用函數(shù) transform映射之后的新值替換 |
find(input: CharSequence, startIndex: Int = 0): MatchResult? | 返回輸入字符串中第一個(gè)匹配的值 |
findAll(input: CharSequence, startIndex: Int = 0): Sequence<MatchResult> | 返回輸入字符串中所有匹配的值MatchResult的序列 |
matches
輸入的字符串全部匹配“正則表達(dá)式”返回 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"))
運(yùn)行結(jié)果
false
true
true
true
containsMatchIn
輸入的字符串中至少有一個(gè)匹配就返回 true赡矢,否則就返回 false杭朱。
val r5 = Regex("[0-9]+")
println(r5.containsMatchIn("012abdc"))
println(r5.containsMatchIn("JAVAI"))
運(yùn)行結(jié)果
true
false
matchEntire
對(duì)字符串全部做比較,都匹配正則表達(dá)式返回一個(gè)MatcherMatchResult對(duì)象吹散,否則返回 null弧械。
val r6 = Regex("[0-9]+")
println(r6.matchEntire("1234567890"))
println(r6.matchEntire("1234567890!"))
println(r6.matchEntire("1234567890")?.value)
當(dāng)我們使用 MatcherMatchResult 的 value 值來(lái)顯示匹配結(jié)果,由于 matchEntire 函數(shù)有可能返回一個(gè) null空民,所以這里使用了安全調(diào)用符號(hào)“刃唐?”。
運(yùn)行結(jié)果
kotlin.text.MatcherMatchResult@1fb3ebeb
null
1234567890
replace
replace(input: CharSequence, replacement: String): String
輸入的字符串匹配的部分替換成 replacement 的內(nèi)容界轩。
val r7 = Regex("[0-9]+")
println(r7.replace("12345XYZ33", "abcd"))
這個(gè)例子是把數(shù)字替換成了 abcd画饥。
replace函數(shù)
函數(shù)簽名 replace(input: CharSequence, transform: (MatchResult)->CharSequence): String
它的功能是把輸入的字符串中匹配的值,用函數(shù) transform 映射之后的新值進(jìn)行替換浊猾。
val r8 = Regex("[0-9]+")
println(r8.replace("12XYZ9", {(it.value.toInt() * it.value.toInt()).toString()}))
我們可以看到抖甘,輸入的字符串中有兩個(gè)數(shù)字,一個(gè)是 12 在字符串的前部葫慎,一個(gè)是 9 在字符串的后部衔彻。
運(yùn)行結(jié)果
144XYZ81
12 被替換成了 144,9 被替換成了 81偷办。
find函數(shù)
返回字符串中第一個(gè)匹配的 MatcherMatchResult 對(duì)象
val r9 = Regex("[0-9]+")
println(r9.find("123ADPOIW87WEERUU005"))
println(r9.find("123ADPOIW87WEERUU005")?.value)
這段代碼艰额,會(huì)匹配123,而使用了 value 值的方式顯示出的結(jié)果椒涯,我們更加容易理解柄沮。
運(yùn)行結(jié)果
kotlin.text.MatcherMatchResult@1fb3ebeb
123
findAll
返回輸入的字符串中所有匹配的值的 MatchResult 序列。
我們可以通過(guò) forEach 循環(huán)遍歷顯示所有匹配結(jié)果
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 + "]") }
運(yùn)行結(jié)果
010-12345678 位置:[3..14]
010-10171695 位置:[19..30]
010-20141017 位置:[35..46]