正则表达式
正则表达式(Regular Expressions,简称regex或regexp)是一种强大的文本处理工具,用于匹配、查找、替换字符串中的特定模式。
详细文档 在线调试工具
基础概念
- 模式(Pattern):正则表达式本身就是一个模式,用于描述一系列可能的字符串。
- 匹配(Match):当一个字符串符合正则表达式的模式时,我们说这个字符串与该模式匹配。
- 元字符(Metacharacters):具有特殊意义的字符,例如
.
、*
、+
、?
等。 - 转义(Escaping):使用反斜杠
\
来取消元字符的特殊意义,使它们作为普通字符参与匹配。
常见元字符及其功能
字面字符
- 字面字符是最简单的正则表达式元素,直接代表自己。例如,
a
仅匹配字母a
。
元字符
- 元字符是具有特殊意义的字符,用来构造复杂的匹配模式。
.
:匹配除换行符外的任何单个字符。^
:匹配字符串的开始位置。如:^a
匹配以 a 开始的字符串$
:匹配字符串的结束位置。如,a$
匹配以 a 结束的字符串*
:匹配前面的表达式零次或多次。如:ab*c
,表示 匹配 ac、abc、abbc 等,即 a 后跟零个或多个 b,再跟c。+
:匹配前面的表达式一次或多次。如:ab+c
,表示 匹配 abc、abbc 等,即 a 后跟一个或多个 b,再跟 c。?
:匹配前面的表达式零次或一次。如:ab?c
,表示 匹配 ac 或 abc,即 a 后跟零个或一个 b,再跟 c.{n}
:匹配前面的表达式恰好 n 次。{n,}
:匹配前面的表达式至少 n 次。{n,m}
:匹配前面的表达式至少 n 次,但不超过 m 次。如a{2,4}
, 表示匹配两到四个连续的 a。
示例[]
:定义一个字符集,匹配括号内的任何一个字符。[^...]
:定义一个否定字符集,匹配不在括号内的任何字符。()
:创建一个捕获组,可以用来引用组内的内容。如:(ab)c
,表示匹配 abc,并将 ab 作为一个组捕获。|
:逻辑或,表示选择前面或后面的一个表达式。如:ab|cd
,表示匹配 ab 或者 cd\
:转义字符,用来转义后续的特殊字符。如:\.
,表示匹配点号 .(因为 . 是元字符,需要用 \ 转义)
字符类
- 字符类是预定义的字符集,简化了常见字符集的书写。
\d
:匹配任何数字,等价于[0-9]
。\D
:匹配任何非数字,等价于[^0-9]
。\s
:匹配任何空白字符,包括空格、制表符、换页符等。如:\s+,表示匹配一个或多个空白字符(空格、制表符、换行符等)\S
:匹配任何非空白字符。\w
:匹配任何字母数字字符,包括下划线_
,等价于[a-zA-Z0-9_]
。\W
:匹配任何非字母数字字符,等价于[^a-zA-Z0-9_]
。\b
:匹配单词边界。\B
:匹配非单词边界。
模式修饰符
- 修饰符用来改变正则表达式的匹配行为。
i
:忽略大小写。g
:全局匹配(不只匹配第一次出现)。m
:多行匹配,使^
和$
能够匹配每一行的开始和结束。u
:Unicode 模式,在支持 Unicode 的环境中启用 Unicode 字符类。y
:粘附模式,从上次匹配结束的地方开始匹配。
其他
(?:pattern)
: 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。- 例如,
industr(?:y|ies)
是比industry|industries
更经济的表达式。
- 例如,
(?=pattern)
:执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。- 例如,‘Windows (?=95|98|NT|2000)’ 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
(?!pattern)
:执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。- 例如,‘Windows (?!95|98|NT|2000)’ 匹配"Windows 3.1"中的 “Windows”,但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
实例及解析
匹配电子邮件地址
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
^
:确保电子邮件地址位于字符串的开始。[a-zA-Z0-9_.+-]+
:匹配一个或多个用户名部分的字符。@
:匹配 @ 符号。[a-zA-Z0-9-]+
:匹配一个或多个域名部分的字符。\.
:匹配点号.
。[a-zA-Z0-9-.]+
:匹配顶级域名部分。$
:确保电子邮件地址位于字符串的末尾。
匹配手机号码
^\+?1?\d{9,15}$
^
:确保号码位于字符串的开始。\+?
:可选的加号+
。1?
:可选的前缀1
。\d{9,15}
:匹配 9 到 15 位数字。$
:确保号码位于字符串的末尾。
匹配日期格式
\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])
\d{4}
:匹配四位数字(年份)。-
:匹配短横线-
。(0[1-9]|1[012])
:匹配月份,范围从 01 到 12。(0[1-9]|[12][0-9]|3[01])
:匹配天数,范围从 01 到 31。
常用案例
- 整数或者小数:
^[0-9]+\.{0,1}[0-9]{0,2}$
- 英文字母:
^[A-Za-z]+$
- 汉字:
^[\u4e00-\u9fa5]{0,}$
- 邮箱:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
- 域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
- url:
[a-zA-z]+://[^\s]*
或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
- 手机号码:
^1[35789]\d{9}$
- 校验IP-v4地址:
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
- 校验IP-v6地址:
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
- 身份证号码18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
使用场景
- 验证输入:如电子邮件地址、电话号码格式等。
- 搜索和替换:在文档中查找特定模式的文本,并进行替换。
- 数据提取:从大量文本中提取有用信息,如日期、价格等。
- 文本清理:去除不需要的字符或格式化文本。
注意事项
- 性能问题:复杂的正则表达式可能会导致性能下降,尤其是在处理大数据集时。
- 安全性:不当的正则表达式使用可能导致安全漏洞,如拒绝服务攻击。
- 测试:在实际应用之前,应该充分测试正则表达式以确保其正确性和鲁棒性。