Kotlin 中的正则表达式:从基础到进阶技巧
正则表达式(regex)是一种基于模式搜索、提取和替换文本的强大工具。在 Kotlin 中,通过 Regex 类实现正则表达式的使用,该类为所有标准操作提供了丰富的 API。本文将介绍 Kotlin 中正则表达式的语法、主要函数及实践示例。
1. Kotlin 中 Regex 的创建与基本语法
在 Kotlin 中,正则表达式通过 Regex 类或字符串的 .toRegex() 扩展函数创建,支持所有标准元字符和量词。
创建 Regex 的方式:
// 方法1:通过构造函数val regex = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
// 方法2:通过 toRegex()val pattern = "[a-z]+@[a-z]+\\\\.[a-z]+".toRegex()
// 方法3:带选项(不区分大小写)val caseInsensitive = Regex("kotlin", RegexOption.IGNORE_CASE)基本元字符和量词:
.— 任意字符(除换行符外)\\d— 数字(0-9)\\w— 字母、数字或下划线\\s— 空白字符^— 字符串开头$— 字符串结尾*— 0 次或多次重复+— 1 次或多次重复?— 0 次或 1 次重复{n,m}— n 到 m 次重复
2. 基本操作:搜索、检查和提取
Regex 类提供了多种处理文本的方法。我们来看最重要的几个。
检查匹配(matches)
matches() 方法检查整个字符串是否完全匹配模式:
val phonePattern = Regex("\\\\+7\\\\d{10}")println(phonePattern.matches("+79261234567")) // trueprintln(phonePattern.matches("+7926123456")) // false(9 位数字,应为 10 位)查找第一个匹配(find)
find() 方法以 MatchResult? 对象的形式返回第一个匹配:
val text = "Contacts: email@test.com and support@domain.org"val emailRegex = "[\\\\w.]+@[\\\\w.]+\\\\.[a-z]+".toRegex()val match = emailRegex.find(text)println(match?.value) // email@test.comprintln(match?.range) // 10..23(起始和结束索引)查找所有匹配(findAll)
要获取所有匹配,使用 findAll(),它返回一个 Sequence<MatchResult>:
val allMatches = emailRegex.findAll(text)allMatches.forEach { match -> println("Found: ${match.value} at position ${match.range.first}")}// 输出:// Found: email@test.com at position 10// Found: support@domain.org at position 28检查是否存在(containsMatchIn)
containsMatchIn() 方法返回一个 Boolean 值——表示是否存在至少一个匹配:
val hasEmail = emailRegex.containsMatchIn(text)println(hasEmail) // true3. 使用 Regex 进行替换和分割
正则表达式非常适合替换字符串中的部分内容以及分割文本。
替换第一个匹配(replaceFirst)
val original = "ID: 12345, code: 67890"val digitRegex = "\\\\d+".toRegex()val masked = digitRegex.replaceFirst(original, "***")println(masked) // ID: ***, code: 67890替换所有匹配(replace)
val censored = digitRegex.replace(original, "***")println(censored) // ID: ***, code: ***使用 lambda 进行替换
你可以传入一个 lambda,该 lambda 会为每个匹配项调用: