Kotlin中的正则表达式:完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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) // true


3. 使用 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 会为每个匹配项调用:

博客

书籍推荐