有时候一个正则表达式能「少写100行代码」,工作中经常会用到,我们需要学懂它,本文介绍如何「学懂」正则表达式,并推荐GitHub上最火的正则表达式项目和可视化正则表达式。
通过例子学习正则表达式 Day1
找出以 lefe 或 lefe_x 单词开头,以 wsy 结尾的字符串。比如:“lefe name is wsy” 是合法的,而 “lef name is wsy” 是非法的。
「正则表达式为」
"(^(?:lefe|lefe_x)\b.{0,}wsy$)"
- `^`表示从字符串的开始位置匹配,`^(?:lefe|lefe_x)` 表示以 `lefe` 或者 `lefe_x `开头;
- `|` 表示或,比如 A | B | C ,表示 A,B 和 C 中任意一个;
- `()` 表示一个组,`(?:)` 表示不捕获这个分组;
- `\b` 表示匹配一个单词的边界,在这里只能匹配 `lefe` 和 `lefe_x`;
- 匹配字符串的开头和结尾后,基本上完成了题目的要求,但是字符串`lefe`(lefe_x)和`wsy`之间可以是任意字符,`.` 表示匹配任意字符(不包含换行符),`{0,}`表示匹配0个或多个字符,则`.{0,}` 表示匹配0个或多个任意字符(不包含换行符);
- `$`表示从字符串的结尾处开始匹配,`wsy$` 则表示以 `wsy` 结尾。
【 知识点 】
- 字符边界`^`,`$` 和 `\b` 表示字符的边界,`^` 匹配字符串的开头,`$`匹配字符串的结尾,`\b`匹配单词的边界,如:`lefe\b` 可以匹配 `lefe` ,但不可匹配 `lefe_x`;
- 量词
{m} 只出现 m 次,lefe{2} 只能匹配 lefee
{m,n} 出现 m 到 n 次
{m,} 至少出现 m 次
- 选择表达式
比如 lefe | Lefe_x | Lefe ,表示 lefe,Lefe_x 和 Lefe 中任意一个
- 分组
以括号括起来的字符集为一个分组,在 ( 添加 ?: 将忽略这个分组
- 字符集
. 匹配除换行符以外的任意一个字符
\w = [0-9a-zA-Z_]
\W = [^0-9a-zA-Z_]
\s = [\t\n\v]
\S = [^\t\n\v]
\d = [0-9]
\D = [^0-9]
通过例子学习正则表达式 Day2
匹配以 `lefe` 开头,`lefe` 后面不能紧跟`_x`,后面由数字,-,_和字母组成,且不包含l,e,f 三个字母中的任意一个(至少一位),且为最短的用户名。
【分析】
根据要求可以把题目拆分成:
1.以 `lefe` 开头,不能为 `lefe_x`。可以转换成 `^lefe(?!_x)`;
2.中间部分由数字,-,_和字母组成,不能包含 l,e,f,至少一位。可以转换成 `[0-9a-dg-km-zA-DG-KM-Z_-]+`;
3.匹配最短的。在正则表达式中用到了贪婪与非贪婪的概念,使用 `?`;
【正则表达式】^(lefe(?!_x)(?:[0-9a-dg-km-zA-DG-KM-Z_-]+?))
【知识点】
1.非获取匹配
lefe(?=_x) ,lefe 后面紧跟着 _x,正向肯定预查
lefe(?!_x) ,lefe 后面不能出现 _x,正向否的定预查
(?(?<=lefe)_x ,_x 前面为 lefe,反向否的定预查
2.字符集合
[xyz] 匹配 x,y,z 任意一个字符;
[^xyz] 匹配除 x,y,z 外的任意一个字符;
[a-z] 匹配 a-z 中任意一个字符;
3.贪婪匹配与非贪婪匹配
默认的匹配规则为非贪婪匹配,使用 `?` 使贪婪匹配变为非贪婪匹配。比如:使用正则表达式`lefe{2,}` 匹配 `lefeeeeeeee`,如果为贪婪匹配(`lefe{2,}`)时将匹配 `lefeeeeeeee `,为非贪婪匹配(`lefe{2,}?`)时,将匹配 `lefee`。
4.量词 `*`,`+`,`?`
`'lefe*'` ,lef 后有0个或多个e
`'lefe+'` ,lef 后有1个或多个e
`'lefe?'` ,lef 后有0个或1个e
通过例子学习正则表达式 Day3
【例3】匹配由数字和字母组成的 6-16 位字符串。
【分析】
- 数字和字母组成,可以表示为:`[0-9a-zA-Z]`;
- 6-16位字符,可以表示为`{6,16}`;
- 由数字和字母组成,则不能为纯数字和纯字母组成的。
【正则表达式】^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$
【解析】
`?!`在【例2】中已说明,`(?![0-9]+$)` 不能为纯数字,`(?![a-zA-Z]+$)` 不能纯字母。
【例4】匹配 html 标签,比如 `
Hello lefe。`【分析】
html 标签为成对出现的,比如`,`
【正则表达式】 ^.*
【知识点】
`\数字`:表示引用分组,`\1` 表示匹配分组1
推荐
1. 可视化网站 https://regexper.com/
它可以把正则表达式以图的形式表达出来。比如:
2. GitHub 最火的正则表达式项目:https://github.com/ziishaned/learn-regex
推荐阅读:
开启我的前端之路
图解数据结构和算法