Kotlin正则表达式实例详解:实战应用
正则表达式(regex)是一种强大的文本处理工具,能够根据模式执行字符串的搜索、替换和验证。在Kotlin中,正则表达式通过Regex类和一系列便捷的扩展函数实现。本文将详细讲解其语法、核心方法,并通过实战示例帮助你快速掌握Kotlin中的正则表达式。
1. Regex类基础
在Kotlin中,使用Regex类创建正则表达式。模式可以通过普通字符串或原始字符串(三重引号""")定义,后者尤其方便,无需转义反斜杠。
// 普通字符串val pattern1 = Regex("\\\\d+") // 一个或多个数字
// 原始字符串(推荐)val pattern2 = Regex("""\\d+""") // 效果相同,无需转义Regex类还可以接受可选标志,例如RegexOption.IGNORE_CASE用于不区分大小写的搜索。
val caseInsensitive = Regex("""hello""", RegexOption.IGNORE_CASE)2. 核心方法:match、find、replace
Kotlin提供了几个关键方法来处理正则表达式。下面介绍最常用的几个。
2.1. matchEntire方法(完全匹配)
检查整个字符串是否与模式完全匹配。返回MatchResult?或null。
val regex = Regex("""\\d{3}-\\d{2}-\\d{4}""")val text = "123-45-6789"val matchResult = regex.matchEntire(text)println(matchResult?.value) // 输出:123-45-6789
// 如果字符串不匹配模式val badText = "123-45-678"println(regex.matchEntire(badText)) // 输出:null2.2. find方法(首次匹配)
查找字符串中第一个匹配的模式。返回MatchResult?。
val regex = Regex("""\\d+""")val text = "价格:150元,折扣:30%"val firstMatch = regex.find(text)println(firstMatch?.value) // 输出:1502.3. findAll方法(所有匹配)
查找所有不重叠的模式匹配项。返回MatchResult序列。
val regex = Regex("""\\d+""")val text = "价格:150元,折扣:30%"val allMatches = regex.findAll(text)allMatches.forEach { println(it.value) }// 输出:// 150// 302.4. replace方法(替换)
将所有匹配的模式替换为指定字符串或lambda表达式的结果。
val regex = Regex("""\\d+""")val text = "ID:12345,代码:67890"val result = regex.replace(text, "***")println(result) // 输出:ID:***,代码:***
// 使用lambda进行动态替换val dynamicResult = regex.replace(text) { matchResult -> "[" + matchResult.value.toInt().toString() + "]"}println(dynamicResult) // 输出:ID:[12345],代码:[67890]3. 捕获组(Capturing Groups)
捕获组允许提取匹配的部分。在Kotlin中,可以通过索引或名称(如果指定)访问组。
3.1. 按索引访问
val regex = Regex("""(\\d{2})\\.(\\d{2})\\.(\\d{4})""") // 日期格式:DD.MM.YYYYval text = "今天:15.03.2024"val match = regex.find(text)if (match != null) { val (day, month, year) = match.destructured println("日:$day,月:$month,年:$year") // 输出:日:15,月:03,年:2024}3.2. 命名组
Kotlin支持命名组(语法(?<name>...))。
val regex = Regex("""(?<username>\\w+)@(?<domain>\\w+\\.\\w+)""")val text = "邮箱:user@example.com"val match = regex.find(text)if (match != null) { val username = match.groups["u