Kotlin 中的正则表达式:完整指南与示例
正则表达式 (regex) 是一种强大的工具,用于根据模式搜索、提取和替换文本。在 Kotlin 中,正则表达式通过 Regex 类实现,该类提供了便捷的 API 并与 Java 的 java.util.regex.Pattern 实现完全兼容。在本文中,我们将通过清晰的示例,详细讲解在 Kotlin 中使用正则表达式的各个方面。
1. 在 Kotlin 中创建和基本使用 Regex
在 Kotlin 中,有两种主要方法可以创建正则表达式:
Regex类构造函数 — 传入包含模式的字符串。.toRegex()扩展方法 — 在字符串上调用。
创建示例:
// 方法 1:构造函数val regex1 = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
// 方法 2:toRegex()val regex2 = "\\\\d{3}-\\\\d{2}-\\\\d{4}".toRegex()
// 带标志(不区分大小写搜索)val regex3 = Regex("hello", RegexOption.IGNORE_CASE)
// 多行模式val regex4 = Regex("^start", RegexOption.MULTILINE)请注意:在 Kotlin 中,与 Java 一样,转义反斜杠需要使用双反斜杠 \\\\。如果您想写 \\d,则需要写成 "\\\\d"。
2. Regex 的主要函数:检查、搜索、替换
Regex 类提供了几个用于处理字符串的关键函数。
2.1. 检查完全匹配 — matches()
如果整个字符串完全匹配模式,matches() 函数返回 true。
val emailRegex = Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}")
val email1 = "user@example.com"val email2 = "invalid-email"
println(emailRegex.matches(email1)) // trueprintln(emailRegex.matches(email2)) // false2.2. 搜索第一个匹配项 — find()
以 MatchResult? 对象(如果未找到则为 null)的形式返回第一个匹配项。
val text = "我的电话:123-45-6789 还有 987-65-4321"val phoneRegex = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
val firstMatch = phoneRegex.find(text)if (firstMatch != null) { println("找到电话:${firstMatch.value}") // 找到电话:123-45-6789 println("起始位置:${firstMatch.range.first}") // 起始位置:6}2.3. 搜索所有匹配项 — findAll()
以 Sequence<MatchResult> 的形式返回所有不重叠的匹配项序列。
val text = "价格:100 卢布,250 卢布,50 卢布"val priceRegex = Regex("\\\\d+")
val prices = priceRegex.findAll(text)prices.forEach { match -> println("价格:${match.value}")}// 输出:// 价格:100// 价格:250// 价格:502.4. 根据模式替换 — replace()
replace() 函数将所有匹配项替换为指定的字符串或 lambda 表达式的结果。
val text = "我的邮箱:john@mail.com 和 support@site.org"val emailRegex = Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}")
// 简单替换val masked = emailRegex.replace(text, "[EMAIL HIDDEN]")println(masked) // 我的邮箱:[EMAIL HIDDEN] 和 [EMAIL HIDDEN]
// 使用 lambda 替换(动态)val replaced = emailRegex.replace(text) { match -> val local = match.value.split("@")[0] "${local.first()}***@***"}println(replaced) // 我的邮箱:j***@*** 和 s***@***2.5. 分割字符串 — split()
根据正则表达式的匹配项分割字符串。
val text = "苹果,梨;香蕉|橙子"val separators = Regex("[,;|]")
val fruits = separators.split(text)println(fru