正则表达式(Regular Expression,简称regex)是一种用于描述和匹配文本模式的工具。它在许多编程语言和文本处理工具中被广泛使用。正则表达式可以用来搜索、替换、分割和验证字符串。
基本概念
-
字符:
- 普通字符:如
a
,b
,1
,2
等,匹配自身。 - 元字符:如
.
,*
,?
,+
,[]
,{}
等,有特殊含义,需要转义才能表示自身。
- 普通字符:如
-
字符类:
-
[abc]
:匹配a
、b
或c
中的任意一个字符。 -
[a-z]
:匹配从a
到z
范围内的任意一个小写字母。 -
[^abc]
:匹配除a
、b
和c
以外的任意字符。
-
-
预定义字符类:
-
\d
:匹配任意一个数字,等价于[0-9]
。 -
\D
:匹配任意一个非数字字符,等价于[^0-9]
。 -
\w
:匹配任意一个字母、数字或下划线,等价于[a-zA-Z0-9_]
。 -
\W
:匹配任意一个非字母、非数字和非下划线的字符,等价于[^a-zA-Z0-9_]
。 -
\s
:匹配任意一个空白字符(空格、制表符、换页符等)。 -
\S
:匹配任意一个非空白字符。
-
-
量词:
-
*
:匹配前面的子表达式零次或多次。 -
+
:匹配前面的子表达式一次或多次。 -
?
:匹配前面的子表达式零次或一次。 -
{n}
:匹配前面的子表达式恰好n
次。 -
{n,}
:匹配前面的子表达式至少n
次。 -
{n,m}
:匹配前面的子表达式至少n
次,至多m
次。
-
-
边界匹配:
-
^
:匹配字符串的开头。 -
$
:匹配字符串的结尾。 -
\b
:匹配一个单词边界。 -
\B
:匹配一个非单词边界。
-
-
分组和捕获:
-
()
:用于分组和捕获。(abc)
匹配abc
并捕获匹配结果。 -
(?:abc)
:只分组不捕获。
-
示例
假设我们有一个字符串 text
为 “Hello, world! 123”. 我们可以使用正则表达式来执行各种操作。
匹配所有的单词
val regex = "\\w+".toRegex()
val matches = regex.findAll(text)
for (match in matches) {
println(match.value)
}
// 输出:
// Hello
// world
// 123
匹配所有的数字
val regex = "\\d+".toRegex()
val matches = regex.findAll(text)
for (match in matches) {
println(match.value)
}
// 输出:
// 123
替换所有的数字为 #
val result = text.replace("\\d+".toRegex(), "#")
println(result)
// 输出:
// Hello, world! #
实际应用
-
验证输入:
- 电子邮件地址验证:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 手机号码验证:
^\d{10}$
- 电子邮件地址验证:
-
搜索和替换:
- 将所有的空格替换为下划线:
text.replace("\\s+".toRegex(), "_")
- 将所有的空格替换为下划线:
-
文本提取:
- 提取HTML标签内容:
<(\w+)>(.*?)</\1>
- 提取HTML标签内容:
正则表达式是一个非常强大且灵活的工具,可以极大地简化复杂字符串处理任务。通过熟练掌握正则表达式,可以提高代码的效率和简洁性。