跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kotlin正则表达式
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kotlin正则表达式 = 正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,用于在字符串中匹配、查找、替换或提取特定模式的文本。在Kotlin中,正则表达式通过`Regex`类实现,并提供了丰富的API来简化字符串操作。本章将详细介绍Kotlin中正则表达式的基本语法、常见用法和实际应用场景。 == 基本概念 == 正则表达式由一系列字符和特殊符号组成,用于定义字符串的匹配规则。以下是正则表达式的基本组成部分: * '''字面字符''':普通字符(如`a`、`1`)直接匹配自身。 * '''元字符''':具有特殊含义的字符,如`.`(匹配任意字符)、`*`(匹配前一个字符0次或多次)。 * '''字符类''':用`[]`定义,匹配其中任意一个字符,如`[abc]`匹配`a`、`b`或`c`。 * '''量词''':指定匹配次数,如`+`(1次或多次)、`?`(0次或1次)。 * '''分组''':用`()`将部分模式分组,便于后续引用或操作。 == 创建正则表达式 == 在Kotlin中,可以通过以下方式创建正则表达式: 1. 使用`Regex`构造函数: <syntaxhighlight lang="kotlin"> val regex = Regex("a.b") // 匹配"a"后跟任意字符,再跟"b" </syntaxhighlight> 2. 使用字符串的`toRegex()`扩展函数: <syntaxhighlight lang="kotlin"> val regex = "a.b".toRegex() </syntaxhighlight> 3. 使用三引号字符串(避免转义特殊字符): <syntaxhighlight lang="kotlin"> val regex = """\d{3}-\d{2}-\d{4}""".toRegex() // 匹配美国社保号格式 </syntaxhighlight> == 常用方法 == Kotlin的`Regex`类提供了以下常用方法: === 1. 匹配整个字符串(`matches`) === 检查字符串是否完全匹配正则表达式: <syntaxhighlight lang="kotlin"> val regex = Regex("a.b") println(regex.matches("axb")) // 输出: true println(regex.matches("axyb")) // 输出: false </syntaxhighlight> === 2. 查找匹配项(`find`和`findAll`) === * `find`:返回第一个匹配项(`MatchResult?`) * `findAll`:返回所有匹配项的序列 <syntaxhighlight lang="kotlin"> val text = "Kotlin 1.6 released in 2021" val regex = Regex("\\d+") // 匹配一个或多个数字 val firstMatch = regex.find(text) println(firstMatch?.value) // 输出: 1 val allMatches = regex.findAll(text).toList() allMatches.forEach { println(it.value) } // 输出: 1, 6, 2021 </syntaxhighlight> === 3. 替换匹配项(`replace`和`replaceFirst`) === * `replace`:替换所有匹配项 * `replaceFirst`:仅替换第一个匹配项 <syntaxhighlight lang="kotlin"> val text = "foo bar baz" val regex = Regex("ba.") println(regex.replace(text, "XXX")) // 输出: foo XXX XXX println(regex.replaceFirst(text, "XXX")) // 输出: foo XXX baz </syntaxhighlight> === 4. 分割字符串(`split`) === 根据正则表达式分割字符串: <syntaxhighlight lang="kotlin"> val text = "apple,banana;cherry" val regex = Regex("[,;]") // 匹配逗号或分号 val parts = regex.split(text) println(parts) // 输出: [apple, banana, cherry] </syntaxhighlight> == 正则表达式语法详解 == 以下是一些常用的正则表达式语法: === 字符类 === * `[abc]`:匹配`a`、`b`或`c` * `[^abc]`:匹配除`a`、`b`、`c`外的任意字符 * `[a-z]`:匹配任意小写字母 * `[A-Z0-9]`:匹配大写字母或数字 === 预定义字符类 === * `\d`:数字,等价于`[0-9]` * `\D`:非数字,等价于`[^0-9]` * `\s`:空白字符(空格、制表符等) * `\w`:单词字符(字母、数字、下划线) === 量词 === * `X?`:0次或1次 * `X*`:0次或多次 * `X+`:1次或多次 * `X{n}`:恰好n次 * `X{n,}`:至少n次 * `X{n,m}`:n到m次 === 边界匹配 === * `^`:字符串开头 * `$`:字符串结尾 * `\b`:单词边界 == 分组与捕获 == 分组允许将部分正则表达式组合起来,并捕获匹配的子字符串: <syntaxhighlight lang="kotlin"> val text = "John: 30, Alice: 25" val regex = Regex("(\\w+): (\\d+)") // 两个分组:姓名和年龄 val matches = regex.findAll(text).toList() matches.forEach { match -> println("Name: ${match.groupValues[1]}, Age: ${match.groupValues[2]}") } // 输出: // Name: John, Age: 30 // Name: Alice, Age: 25 </syntaxhighlight> == 实际应用案例 == === 案例1:验证电子邮件格式 === <syntaxhighlight lang="kotlin"> fun isValidEmail(email: String): Boolean { val regex = Regex("^[\\w.-]+@[\\w.-]+\\.[a-z]{2,}\$", RegexOption.IGNORE_CASE) return regex.matches(email) } println(isValidEmail("test@example.com")) // true println(isValidEmail("invalid.email")) // false </syntaxhighlight> === 案例2:提取HTML标签内容 === <syntaxhighlight lang="kotlin"> val html = "<h1>Title</h1><p>Paragraph</p>" val regex = Regex("<.*?>(.*?)<.*?>") val contents = regex.findAll(html).map { it.groupValues[1] }.toList() println(contents) // 输出: [Title, Paragraph] </syntaxhighlight> === 案例3:日志文件分析 === 假设日志格式为`[2023-01-01] ERROR: File not found`: <syntaxhighlight lang="kotlin"> val log = "[2023-01-01] ERROR: File not found" val regex = Regex("\\[(.*?)\\] (\\w+): (.*)") val match = regex.find(log)!! println("Date: ${match.groupValues[1]}") println("Level: ${match.groupValues[2]}") println("Message: ${match.groupValues[3]}") // 输出: // Date: 2023-01-01 // Level: ERROR // Message: File not found </syntaxhighlight> == 性能优化建议 == 1. '''预编译正则表达式''':如果多次使用同一正则表达式,建议将其定义为全局常量: <syntaxhighlight lang="kotlin"> val EMAIL_REGEX = Regex("^[\\w.-]+@[\\w.-]+\\.[a-z]{2,}\$") </syntaxhighlight> 2. '''避免贪婪匹配''':默认量词(`*`、`+`)是贪婪的,可能影响性能。在不需要时使用惰性匹配(`*?`、`+?`)。 3. '''使用具体字符类''':`\d`比`[0-9]`更易读,但后者在某些情况下性能更好。 == 常见问题与陷阱 == * '''转义字符''':在字符串中需对反斜杠转义(`\\d`),或使用三引号字符串(`"""\d"""`)。 * '''贪婪匹配''':`".*"`会匹配到字符串末尾,可能不符合预期。 * '''Unicode字符''':默认情况下,`\w`等字符类仅匹配ASCII字符,可使用`RegexOption.UNICODE_CHARACTER_CLASS`启用Unicode支持。 == 总结 == Kotlin的正则表达式功能强大且易于使用,通过`Regex`类和丰富的API可以高效处理文本匹配、提取和替换任务。掌握正则表达式能显著提升字符串处理的灵活性和效率。建议从简单模式开始练习,逐步掌握复杂表达式的编写技巧。 [[Category:编程语言]] [[Category:Kotlin]] [[Category:Kotlin字符串]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)