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…)
注意事项
在使用正则表达式时,若不能匹配想要的结果,不一定是正则表达式写错,可能是使用的正则表达式引擎不支持此特性,需要查询对应版本的文档。
