Kotlin中的正则表达式及示例:实践指南

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

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

开始课程

Kotlin中的正则表达式及示例:实践指南

\n\n

正则表达式(regex)是处理字符串的强大工具。在Kotlin中,它们基于Java的Pattern和Matcher类实现,同时语言本身也添加了便捷的扩展和语法糖。本文将结合实际示例,讲解如何在Kotlin中使用正则表达式:从简单的搜索到替换和字符串分割。

\n\n

基础语法:创建与编译

\n\n

在Kotlin中,可以通过两种方式创建正则表达式:使用Regex类或通过字符串模板。第一种方式更推荐,因为它提供了更多方法。

\n\n
// 方式1:通过Regex类\nval regex = Regex("\\\\d+") // 一个或多个数字\n\n// 方式2:通过字符串(不推荐用于复杂表达式)\nval pattern = "\\\\d+".toRegex()
\n\n

注意双反斜杠:\\\\d是为了在Java/Kotlin字符串中表示\\d字符。为简化起见,Kotlin支持原始字符串(三重引号"""),无需转义:

\n\n
val regex = Regex("""\\d+""") // 原始字符串——无需重复反斜杠
\n\n

还可以添加标志,例如RegexOption.IGNORE_CASE:

\n\n
val regex = Regex("kotlin", RegexOption.IGNORE_CASE)
\n\n

搜索与匹配检查

\n\n

最常见的操作是检查字符串是否包含符合模式的子串,以及查找所有匹配项。

\n\n

检查是否包含匹配:containsMatchIn

\n\n
val text = "我的号码:123-45-678"\nval digitRegex = Regex("""\\d+""")\n\nif (digitRegex.containsMatchIn(text)) {\n    println("文本中包含数字!")\n}
\n\n

查找第一个匹配:find

\n\n
val result = digitRegex.find(text)\nprintln(result?.value) // 输出:123
\n\n

查找所有匹配:findAll

\n\n
val allMatches = digitRegex.findAll(text)\nallMatches.forEach { match ->\n    println("找到:${match.value}") // 123, 45, 678\n}
\n\n

findAll方法返回一个MatchResult对象序列。每个对象不仅包含匹配本身(.value),还包含其在字符串中的位置(.range)。

\n\n

使用捕获组

\n\n

捕获组是模板中用圆括号括起来的部分。它们允许提取特定的数据片段。例如,将电子邮件解析为用户名和域名:

\n\n
val email = "user@example.com"\nval emailRegex = Regex("""(.+)@(.+)""")\nval matchResult = emailRegex.find(email)\n\nif (matchResult != null) {\n    val (username, domain) = matchResult.destructured\n    println("用户名:$username") // user\n    println("域名:$domain")     // example.com\n}
\n\n

destructured结构可以方便地将组分解为变量。如果有更多组,可以通过索引访问:

\n\n
val fullMatch = matchResult.value      // user@example.com\nval group1 = matchResult.groupValues[1] // user\nval group2 = matchResult.groupValues[2] // example.com
\n\n

命名组(Kotlin 1.7+)

\n\n

从Kotlin 1.7开始,可以使用命名组:

\n\n
val namedRegex = Regex("""(?<name>\\w+)@(?<domain>\\w+\\.\\w+)""")\nval match = namedRegex.find("contact@kotlin.org")\nif (match != null) {\n    println(match.groups["name"]?.value)   // contact\n    println(match.groups["domain"]?.value) // kotlin.org\n}
\n\n

使用replace替换文本

\n\n

replace方法允许将所有匹配项替换为新字符串。在替换模板中,可以引用捕获组

博客

书籍推荐