我们在 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