type
status
date
slug
summary
tags
category
icon
password
@ZZHow(ZZhow1024)
参考课程:
【【GeekHour】30分钟正则表达式教程】
简介
- 精确地描述需要匹配的字符组合,从而高效和灵活的处理文本。
- 应用:
- 网站验证用户输入信息是否符合规范。
- 文本编辑软件中进行更高级的搜索和替换。
- Linux 和 macOS 中通过 grep 和 sed 等命令使用正则表达式进行文本处理。
工具
- 正则表达式在线工具网站:
- VS Code 中的 Regex Previewer 插件。
- Python 中的 re 模块。
基本语法 (Basic)
- 开始:正则表达式一般使用两个斜线包裹起来,如
/表达式/修饰符
。
- 修饰符:
g
:global,全局匹配。i
:case insensitive,忽略大小写。m
:multiline,多行匹配。s
:single line (dotall),默认情况下的圆点.
是匹配除换行符\n
之外的任何字符,加上 s 修饰符之后.
中包含换行符\n
。u
:unicode,开启完整的 Unicode 支持。y
:sticky,粘滞(Sticky)模式,在文本中的确切位置搜索。
- 匹配字母 或 数字:
a
,匹配 a。ab
,匹配 ab。1
,匹配 1。
- 匹配任意字符(
.
号): ab.
匹配 ab 后加上一个任意字符的字符串。
- 集合(
[]
方括号): [abc0]
,匹配 a 或 b 或 c 或 0。[a-zA-Z0-9]
,匹配 a 至 z 的所有小写字母、A 至 Z 的所有大写字母 或 0 至 9 的数字。[^a-zA-Z]
,匹配除 a 至 z 的所有小写字母 和 A 至 Z 的所有大写字母以外的字符。
- 预定义字符类:
\d
,匹配所有数字,作用同[0-9]
。\D
,匹配所有非数字,作用同[^0-9]
。\w
,匹配所有字母、数字 或 下划线,作用同[a-zA-Z0-9_]
。\W
,匹配除字母、数字 和 下划线以外的字符,作用同[^a-zA-Z0-9_]
。\s
,匹配空白字符(空格 或 Tab),作用同[ ]
。\S
,匹配除空白字符(空格 或 Tab)以外的字符,作用同[^ ]
。
- 需要转义的字符:
* . ? + $ ^ [ ] ( ) { } | \ /
,匹配以上字符时需要在字符钱加上\
。
位置和边界匹配 (Anchors)
- 行边界
- 修饰符
^
:表示每一行的开头。$
:表示每一行的结尾。- 例子
^abc$
:一行的开头和结尾之间只有 abc 的字符串。
- 单词边界
- 修饰符
\b
:表示单词边界。\B
:表示非单词边界。- 例子
\bon
:匹配以 on 开头的单词中的 on。on\b
:匹配以 on 结尾的单词中的 on。\bon\b
:匹配独立的 on 的单词。\Bon\B
:匹配在单词中间的 on。
量词 (Quantifiers)
+
:表示前面的字符重复了一次或多次。- 例如
ab+
:匹配 ab、abb、abbb…
*
:表示前面的字符重复了零次或多次。- 例如
ab*
:匹配 a、ab、abb…
?
:表示前面的字符重复了零次或一次。- 例如
ab?
:匹配 a 和 ab。
{次数}
:指定前面字符重复的次数。- 例如
ab{2}
:匹配 abb。ab{3}
:匹配 abbb。ab{1,3}
:匹配 ab、abb 和 abbb。ab{3,}
:匹配 abbb、abbbb、abbbbb…ab{3,}?
:非贪婪匹配,只会匹配 abbb。
分组和捕获 (Groups)
- 使用
()
进行分组,使用$数字
进行捕获,使用\数字
进行引用。
- 非捕获分组:
(?:匹配规则)
,该分组将不会被捕获到。
- 例子
(ab){3}
:匹配 ababab。(A|a)pple
:匹配 Apple 和 apple。- 替换年月日的顺序:
- 数据
- 2024-08-19
- 2024/08/20
- 2024_08_21
- 2024.08.22
- 20240823
- 分组
/(\d{4})[-/_.]?(\d{1,2})[-/_.]?(\d{1,2})/gm
- 捕获
$2-$3-$1
- 替换结果
- 08-19-2024
- 08-20-2024
- 08-21-2024
- 08-22-2024
- 08-23-2024
- 引用:
- 数据
- alibaba
- tencent
- apple
- microsoft
- 分组和引用
/\b([a-z])[a-z]*\1\b/gm
- 匹配结果
- alibaba
- tencent
前瞻 (Lookahead) 和 后顾 (Lookbehind)
- 作用:匹配某些字符前面或后面的内容,而不包含这些字符本身。
- 正向前瞻:
(?=匹配规则)
- 例如
\$(?=\d+)
,匹配 $123、$321、$23… 中的 $,匹配所有数字前的 $。
- 负向前瞻:
(?!匹配规则)
- 例如
\$(?!\d+)
,匹配 $abc、$bac、$ac… 中的 $,匹配所有非数字前的 $。
- 正向后顾:
(?<=匹配规则)
- 例如
(?<=\$)\d+
,匹配 $123、$321、$23… 中的 123、321、23…,匹配所有 $ 后的数字。
- 负向后顾:
(?<!匹配规则)
- 例如
(?<!\$)\d+
,匹配 SU7、RTX4080、#123… 中的 7、4080、123…,匹配所有非 $ 后的数字。(?<!\$)\b\d+\b
,可避免匹配 $123、$213、$23… 中的 23、13、3…
正则表达式版本
- POSIX 基本 - Basic Regular Expression (BRE)
- POSIX 扩展 - Extended Regular Expression (ERE)
- Perl 兼容正则表达式 (PCRE)
- 其他版本 (Python、Java、JavaScript…)
注意事项
在使用正则表达式时,若不能匹配想要的结果,不一定是正则表达式写错,可能是使用的正则表达式引擎不支持此特性,需要查询对应版本的文档。