六位纯数字正则表达式_如何学懂正则表达式

有时候一个正则表达式能「少写100行代码」,工作中经常会用到,我们需要学懂它,本文介绍如何「学懂」正则表达式,并推荐GitHub上最火的正则表达式项目和可视化正则表达式。

通过例子学习正则表达式 Day1

找出以 lefe 或 lefe_x 单词开头,以 wsy 结尾的字符串。比如:“lefe name is wsy” 是合法的,而 “lef name is wsy” 是非法的。
「正则表达式为」

"(^(?:lefe|lefe_x)\b.{0,}wsy$)"

f95599a698df511c02fa62fe759eabb5.png

- `^`表示从字符串的开始位置匹配,`^(?: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_-]+?))

c9f816bbf84b84f8566389db46189dce.png

【知识点】
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}$

2e3283fc47af0e7fc0ea891e2d8cef32.png

【解析】
`?!`在【例2】中已说明,`(?![0-9]+$)` 不能为纯数字,`(?![a-zA-Z]+$)` 不能纯字母。

【例4】匹配 html 标签,比如 `

Hello lefe。`
【分析】  
html 标签为成对出现的,比如`,`
【正则表达式】    ^.*

a2f63220e08feb2c1d9bbdd297543681.png

【知识点】  
`\数字`:表示引用分组,`\1` 表示匹配分组1

推荐

1. 可视化网站 https://regexper.com/

它可以把正则表达式以图的形式表达出来。比如:

2e3283fc47af0e7fc0ea891e2d8cef32.png

2. GitHub 最火的正则表达式项目:https://github.com/ziishaned/learn-regexab6189b251d1886b72db7b4e615bdea4.png

推荐阅读:

开启我的前端之路

图解数据结构和算法

dd2d8b1c1748df05c4ed106496a5fa04.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值