Kotlin中的正则表达式及示例:实践指南
\n\n正则表达式(regex)是处理字符串的强大工具。在Kotlin中,它们基于Java的Pattern和Matcher类实现,同时语言本身也添加了便捷的扩展和语法糖。本文将结合实际示例,讲解如何在Kotlin中使用正则表达式:从简单的搜索到替换和字符串分割。
基础语法:创建与编译
\n\n在Kotlin中,可以通过两种方式创建正则表达式:使用Regex类或通过字符串模板。第一种方式更推荐,因为它提供了更多方法。
// 方式1:通过Regex类\nval regex = Regex("\\\\d+") // 一个或多个数字\n\n// 方式2:通过字符串(不推荐用于复杂表达式)\nval pattern = "\\\\d+".toRegex()\n\n注意双反斜杠:\\\\d是为了在Java/Kotlin字符串中表示\\d字符。为简化起见,Kotlin支持原始字符串(三重引号"""),无需转义:
val regex = Regex("""\\d+""") // 原始字符串——无需重复反斜杠\n\n还可以添加标志,例如RegexOption.IGNORE_CASE:
val regex = Regex("kotlin", RegexOption.IGNORE_CASE)\n\n搜索与匹配检查
\n\n最常见的操作是检查字符串是否包含符合模式的子串,以及查找所有匹配项。
\n\n检查是否包含匹配:containsMatchIn
\n\nval text = "我的号码:123-45-678"\nval digitRegex = Regex("""\\d+""")\n\nif (digitRegex.containsMatchIn(text)) {\n println("文本中包含数字!")\n}\n\n查找第一个匹配:find
\n\nval result = digitRegex.find(text)\nprintln(result?.value) // 输出:123\n\n查找所有匹配:findAll
\n\nval allMatches = digitRegex.findAll(text)\nallMatches.forEach { match ->\n println("找到:${match.value}") // 123, 45, 678\n}\n\nfindAll方法返回一个MatchResult对象序列。每个对象不仅包含匹配本身(.value),还包含其在字符串中的位置(.range)。
使用捕获组
\n\n捕获组是模板中用圆括号括起来的部分。它们允许提取特定的数据片段。例如,将电子邮件解析为用户名和域名:
\n\nval 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\ndestructured结构可以方便地将组分解为变量。如果有更多组,可以通过索引访问:
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\nval 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\nreplace方法允许将所有匹配项替换为新字符串。在替换模板中,可以引用捕获组