什么是正则表达式?
正则表达式(Regular Expression,简称 Regex)是一种字符模式,用于描述文本的匹配规则。它们常用于搜索、替换和验证文本。通过正则表达式,你可以匹配特定的字符串模式,如电话号码、电子邮件地址、IP 地址等。
基本语法和符号
1. 普通字符匹配
- 普通字符:正则表达式中的普通字符(如字母和数字)会直接匹配自身。
- 例如,正则表达式
hello
只匹配字符串 "hello"。
- 例如,正则表达式
2. 元字符
元字符是正则表达式中的特殊字符,用于定义更复杂的匹配模式。常见的元字符包括:
.
(点号):匹配任意单个字符(除换行符外)。- 例如,
a.c
可以匹配 "abc"、"a1c" 等。
- 例如,
^
:匹配字符串的开头。- 例如,
^abc
只匹配以 "abc" 开头的字符串。
- 例如,
$
:匹配字符串的结尾。- 例如,
xyz$
只匹配以 "xyz" 结尾的字符串。
- 例如,
*
:匹配前面的字符零次或多次。- 例如,
a*
可以匹配空字符串、"a"、"aa" 等。
- 例如,
+
:匹配前面的字符一次或多次。- 例如,
a+
可以匹配 "a"、"aa" 等。
- 例如,
?
:匹配前面的字符零次或一次。- 例如,
colou?r
可以匹配 "color" 或 "colour"。
- 例如,
|
:表示或运算,用于匹配多个选项之一。- 例如,
cat|dog
可以匹配 "cat" 或 "dog"。
- 例如,
3. 字符集和范围
- 字符集
[ ]
:匹配方括号内的任意一个字符。- 例如,
[aeiou]
匹配任何元音字母。
- 例如,
- 字符范围:可以使用
-
来指定一个字符范围。- 例如,
[a-z]
匹配任何小写字母,[0-9]
匹配任意数字。
- 例如,
- 否定字符集
[ ^ ]
:匹配不在方括号内的字符。- 例如,
[^aeiou]
匹配任何非元音字母。
- 例如,
4. 量词
量词用于指定前一个字符或字符集的匹配次数。
{n}
:匹配前一个字符恰好n
次。- 例如,
a{3}
只匹配 "aaa"。
- 例如,
{n,}
:匹配前一个字符至少n
次。- 例如,
a{2,}
匹配 "aa"、"aaa" 等。
- 例如,
{n,m}
:匹配前一个字符至少n
次,至多m
次。- 例如,
a{1,3}
匹配 "a"、"aa" 或 "aaa"。
- 例如,
5. 特殊字符集
\d
:匹配任何数字字符,相当于[0-9]
。\D
:匹配任何非数字字符。\w
:匹配字母、数字或下划线,相当于[a-zA-Z0-9_]
。\W
:匹配任意非字母、数字或下划线字符。\s
:匹配空白字符(如空格、制表符等)。\S
:匹配任意非空白字符。
6. 边界匹配
- 单词边界
\b
:匹配单词的边界。- 例如,
\bword\b
只匹配完整的单词 "word"。
- 例如,
- 非单词边界
\B
:匹配非单词边界。- 例如,
\Bword
匹配 "password" 中的 "word"。
- 例如,
7. 分组和引用
- 分组
()
:使用小括号将部分正则表达式分组。- 例如,
(abc)+
匹配 "abc"、"abcabc" 等。
- 例如,
- 反向引用:分组之后,可以通过
\1
、\2
等来引用前面的分组。- 例如,
(\w+) \1
匹配两个相同的连续单词,如 "hello hello"。
- 例如,
8. 零宽断言
- 正向先行断言
(?=...)
:匹配某个位置,要求后面满足指定条件。- 例如,
\d(?=abc)
匹配一个数字,前提是它后面是 "abc"。
- 例如,
- 负向先行断言
(?!...)
:匹配某个位置,要求后面不满足指定条件。- 例如,
\d(?!abc)
匹配一个数字,前提是它后面不是 "abc"。
- 例如,
- 正向后行断言
(?<=...)
:匹配某个位置,要求前面满足指定条件。- 例如,
(?<=abc)\d
匹配一个数字,前提是它前面是 "abc"。
- 例如,
- 负向后行断言
(?<!...)
:匹配某个位置,要求前面不满足指定条件。- 例如,
(?<!abc)\d
匹配一个数字,前提是它前面不是 "abc"。
- 例如,
9. 贪婪与懒惰量词
- 贪婪量词:默认情况下,量词是贪婪的,会尽可能多地匹配字符。
- 例如,
a.*b
会匹配从第一个 "a" 到最后一个 "b" 之间的所有字符。
- 例如,
- 懒惰量词
?
:在量词后加上?
,可以使其变为懒惰模式,尽可能少地匹配字符。- 例如,
a.*?b
会匹配从第一个 "a" 到下一个 "b" 之间的最少字符。
- 例如,
10. 特殊字符转义
正则表达式中的某些字符具有特殊含义,如果你想匹配这些字符本身,需要使用反斜杠进行转义。
- 特殊字符:
.
、^
、$
、*
、+
、?
、|
、{
、}
、[
、]
、(
、)
、\
。- 例如,
\.
可以匹配字符 ".",\$
可以匹配字符 "$"。
- 例如,
常见应用场景
1. 匹配电话号码
格式:
123-4567-8901
\d{3}-\d{4}-\d{4}
2. 匹配邮箱地址
格式:
example@mail.com
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
3. 匹配IP地址
格式:
192.168.0.1
\b(?:\d{1,3}\.){3}\d{1,3}\b
4. 匹配URL
格式:
https://www.example.com
https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/\S*)?
5. 匹配日期格式
格式:
YYYY-MM-DD
\d{4}-\d{2}-\d{2}
6. 匹配时间格式
格式:
HH:MM
或HH:MM:SS
\d{2}:\d{2}(:\d{2})?
在线工具
总结
正则表达式是一种非常强大的工具,可以帮助你处理各种文本匹配和操作任务。虽然它的语法看起来有些复杂,但通过不断练习和使用,你会逐渐掌握并理解它的强大之处。建议从简单的表达式开始,逐步尝试更复杂的模式,慢慢熟悉各种元字符、断言、量词和转义的使用方法。
正则表达式的学习需要时间和练习,使用在线工具可以帮助你更好地理解每个正则表达式的作用,并快速验证你的想法。