携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
前言
在正则表达式上篇介绍了Kotlin的 regex 标准库中提供的几个常用正则函数containsMatchIn find findAll matchEntire matches replace以及这些常用函数的用法举例。那本篇就来介绍一下Kotlin中的正则表达式的通配符相关知识点。
常用通配符
| 正则表达式符号 | 含义 |
|---|---|
. | 匹配任何单个字符 |
? | 一次匹配或根本不匹配前面的元素 |
+ | 与前面的元素匹配一次或多次 |
* | 与前面的元素匹配零次或多次 |
^ | 匹配字符串中的起始位置 |
$ | 匹配字符串中的结束位置 |
[abc] | 匹配 a 或 b 或 c |
[a-c] | 范围; 匹配 a 或 b 或 c |
[^abc] | 否定,匹配除 a 或 b 或 c 之外的所有内容 |
\s | 匹配空白字符 |
\w | 匹配单词字符; 等同于[a-zA-Z_0-9] |
\d | 任意单个0到9的数字 |
\D | 任意单个非数字字符 |
示例
元字符(.) : 匹配任何单个字符
val words = listOf("seven", "even", "prevent", "revenge", "maven",
"eleven", "amen", "event")
val pattern = "..even".toRegex() // 俩个点元字符
符合规则的匹配结果:prevent, eleven
问号(?)字符 : 与指定字符零次或一次匹配
val words = listOf("seven", "even", "prevent", "revenge", "maven",
"eleven", "amen", "event")
val pattern = ".?even".toRegex()
符合规则的匹配结果:seven,even
{n, m}字符 :至少匹配指定字符的 n 次,最多匹配 m 次
val words = listOf("pen", "book", "cool", "pencil", "forest", "car",
"list", "rest", "ask", "point", "eyes")
val pattern = "\w{5,6}".toRegex() //其实就是匹配5-6个字符的单词
符合规则的匹配结果:
pencil,point,forest
子模式用()字符创建
val words = listOf("book", "bookshelf", "bookworm",
"bookcase", "bookish", "bookkeeper", "booklet", "bookmark")
val pattern = "book(case|let|ish)?".toRegex()
符合规则的匹配结果:bookcase,booklet,bookish
命名字符类 : \\d+匹配数字
val text = "We met in 2013. She must be now about 27 years old."
val pattern = "\d+".toRegex()
符合规则的匹配结果:2013,27
匹配电子邮件处理
val emails = listOf("vincent.yijun@gmail.com", "andy@yahoocom",
"34234sdfa#2345", "f344@gmail.com", "dandy!@yahoo.com")
val pattern = "[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,18}".toRegex()
符合规则的匹配结果:vincent.yijun@gmail.com,f344@gmail.com
该示例匹配规则分析:
- 本地部分:通常为公司名称,昵称组合
[a-zA-Z0-9._-]+ - 匹配邮箱符号
@ - 邮箱域名部分
[a-zA-Z0-9-]+ - 点字符
\\. - 顶级域名
[a-zA-Z.]{2,18}可包含 2 到 18 个字符
总结
正则表达式的出现对数据查找的效率提升不止一点。学习完这么多的用例后和上篇所介绍的正则函数,可以知道对于正则最重要的概念就是匹配模式,是字符串操作时的依据。它是具体的字符,也可以是特定的转义符。如果掌握以上这些常用的匹配规则和通配字符,那开发中基本上没啥问题!
在掘金(JUEJIN) 一起分享知识, Keep Learning!