15.8 正则表达式
我们在 Kotlin 中除了仍然可以使用 Java中的 Pattern,Matcher 等类之外,Kotlin 还提供了一个正则表达式类 kotlin/text/regex/Regex.kt ,我们通过 Regex 的构造函数来创建一个正则表达式。
15.8.1 构造 Regex 表达式
使用Regex构造函数
>>> val r1 = Regex("[a-z]+")
>>> val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE)
其中的匹配选项 RegexOption 是直接使用的 Java 类 Pattern中的正则匹配选项。
使用 String 的 toRegex 扩展函数
>>> val r3 = "[A-Z]+".toRegex()
15.8.2 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]+")
>>> r1.matches("ABCzxc")
false
>>>
>>> val r2 = Regex("[a-z]+", RegexOption.IGNORE_CASE)
>>> r2.matches("ABCzxc")
true
>>> val r3 = "[A-Z]+".toRegex()
>>> r3.matches("GGMM")
true
containsMatchIn
输入字符串中至少有一个匹配就返回true,没有一个匹配就返回false。
>>> val re = Regex("[0-9]+")
>>> re.containsMatchIn("012Abc")
true
>>> re.containsMatchIn("Abc")
false
matchEntire
输入字符串全部匹配正则表达式返回 一个MatcherMatchResult对象,否则返回 null。
>>> val re = Regex("[0-9]+")
>>> re.matchEntire("1234567890")
kotlin.text.MatcherMatchResult@34d713a2
>>> re.matchEntire("1234567890!")
null
我们可以访问MatcherMatchResult的value熟悉来获得匹配的值。
>>> re.matchEntire("1234567890")?.value
1234567890
由于 matchEntire 函数的返回是MatchResult? 可空对象,所以这里我们使用了安全调用符号 ?.
。
replace(input: CharSequence, replacement: String): String
把输入字符串中匹配的部分替换成replacement的内容。
>>> val re = Regex("[0-9]+")
>>> re.replace("12345XYZ","abcd")
abcdXYZ
我们可以看到,”12345XYZ”中12345
是匹配正则表达式 [0-9]+
的内容,它被替换成了 abcd
。
replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String
把输入字符串中匹配到的值,用函数 transform映射之后的新值替换。
>>> val re = Regex("[0-9]+")
>>> re.replace("9XYZ8", { (it.value.toInt() * it.value.toInt()).toString() })
81XYZ64
我们可以看到,9XYZ8
中数字9和8是匹配正则表达式[0-9]+
的内容,它们分别被transform函数映射 (it.value.toInt() * it.value.toInt()).toString()
的新值 81 和 64 替换。
find
返回输入字符串中第一个匹配的MatcherMatchResult对象。
>>> val re = Regex("[0-9]+")
>>> re.find("123XYZ987abcd7777")
kotlin.text.MatcherMatchResult@4d4436d0
>>> re.find("123XYZ987abcd7777")?.value
123
findAll
返回输入字符串中所有匹配的值的MatchResult的序列。
>>> val re = Regex("[0-9]+")
>>> re.findAll("123XYZ987abcd7777")
kotlin.sequences.GeneratorSequence@f245bdd
我们可以通过 forEach 循环遍历所以匹配的值
>>> re.findAll("123XYZ987abcd7777").forEach{println(it.value)}
123
987
7777
15.8.3 使用 Java 正则表达式类
除了上面 Kotlin 提供的函数之外,我们在 Kotlin 中仍然可以使用 Java 的正则表达式的 API。
val re = Regex("[0-9]+")
val p = re.toPattern()
val m = p.matcher("888ABC999")
while (m.find()) {
val d = m.group()
println(d)
}
上面的代码运行输出:
888
999