目录
❣️ 正则表达式概述
1. 准备:安装RegExpBuddy软件
– 安装RegExpBuddy软件——专门测试正则表达式是否正确的软件(RegExRX)
– 此时,桌面上看到图标
👇
– 配置字体大小:
– 配置并测试规则匹配是否正常
2. 回顾:注册用户时,要求填写手机号
–如果填写错误的手机号,程序会提示错误!
–如果填写正确的手机号,程序会提示正确
3. 问题:程序真的认识手机号吗?
–其实,程序原本不认识手机号,是程序员教程序认识的
4. 正则表达式(Regular Expression)
专门描述字符串中字符出现规则的表达式。
5. 为何使用正则表达式
因为程序不认识人类语言中的词汇,所以才需要程序员用正则表达式教程序认识人类语言中的词汇。程序员用正则表达式教程序认识人类语言中的词汇。
❣️ 正则表达式初体验
正则表达式的含义
正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。
正则表达式的用途
正则表达式可用于:– 1. 验证字符串格式;– 2. 查找敏感词(查水表)
❣️ 定义正则表达式
1. 普通字符
- 最简单的规则,就是一个关键词原文:
– 比如:“我草” 第一个字👉我 第二个字👉草
- 关键词匹配过程
👉 “我草”分别与语句“那天,我去了她家,我说:我草!你家真大”逐字匹配
→我草 →我草→我草
那天,我
去了她家,我说:我草!你家真大
2. 最简单的正则表达式
- 在RegExp Buddy中
–查找一句话中是否包含敏感词“我草”
–如果将一句话中的“我草”,换成“我艹”,还能查询出来吗?
3. 字符集
-
问题:第二个字符换成另一个同音字,就匹配不到了
-
字符集是规定一位字符上多种备选字的列表
-
只要规则中某一位字符上有多种备选字时,就用字符集
-
如何: [备选字列表]
–比如:[草艹槽]
- 匹配时,只要与[]中任意一个字符匹配,就算满足规则
- 字符集匹配过程:
👉 [草艹槽]与语句“马在槽里吃草”逐字匹配
- 如果再连上前边写死的“我”字规则,可匹配三种词
👉 我[草艹槽] → 我草 我艹 我槽
👉 我[草艹槽] →我槽!你家真大!
👉 我[草艹槽] →我艹!你家真大!
◼️ 使用字符集
👉 在RegExp Buddy中
– 定义一个规则同时匹配“我草” ,“我艹” ,“我槽” 三种敏感词
答案: 我[草艹槽] 暂时不要考虑拼音和空格!
– 扩展:修改规则,使其进一步匹配“卧槽”
答案: [我卧][草艹槽]
- [我卧][草艹槽]的匹配过程
[我卧][草艹槽] →[卧槽] →卧槽!你家真大
- 再比如,手机号规则:
– 第一位: 1
– 第二位:3、4、5、6、7、8、9中选其一
– 后9位,每一位上都是从0~9十个数字中任选其一
- 结果:
- 简写:如果[]中部分备选字符连续,可用-省略中间字符
- 比如,手机号规则中:
[3456789] 可简写为 [3-9] 读作 3到9
[0123456789] 可简写为 [0-9] 读作 0到9
- 所以,手机号规则可简写为:
–1[3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
◼️ 使用字符集简写
👉 在RegExp Buddy中
–利用字符集简写定义手机号规则,验证手机号
答案: 1[3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
- 其它简写:
–要匹配一位小写字母:[a-z] 共26个
–要匹配一位大写字母:[A-Z] 共26个
–要匹配一位字母: [A-Za-z] 共52个
–要匹配一位字母或数字:[0-9A-Za-z] 共62个
–要匹配一位汉字:[\u4e00-\u9fa5]
19968 ~ 40869 共20902个
“一” "龥"
◼️ 使用字符集简写
👉 RegExp Buddy中(左上角必须选case sensitive区分大小写)
–利用字符集简写定义车牌号规则:
–第一位:1位汉字
–第二位:1位大写字母
–第三位:· (搜狗输入法打dian,按5)
–后五位,每一位:都是一位大写字母或数字
答案: [\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]
4. 预定义字符集
- 正则表达式语法为四种最常用的字符集定义了最简化写法,称为预定义字符集。
- 包括:
– 要匹配一位数字: \d 等效于 [0-9]
– 要匹配一位字母、数字或_: \w 等效于 [0-9A-Za-z_]
– 要匹配一位空字符:\s 可匹配 空格、制表符Tab等空白
– 要匹配所有文字(通配符): .
- 所以,手机号规则可进一步简写为:
– 1[3-9]\d\d\d\d\d\d\d\d\d
◼️ 使用预定义字符集
👉 在RegExp Buddy中
– 利用预定义字符集简写手机号规则
答案: 1[3-9]\d\d\d\d\d\d\d\d\d

– 利用\s匹配一句英文中的每个空格
答案: \s
5. 数量词
- 问题: 手机号规则中\d写了9遍,车牌号规则中[0-9A-Z]也写了五遍!
- 原因:一个字符集(\d或[0-9])只能匹配一位字符,要匹配9位字符,就必须重复写9遍
- 程序用规则匹配字符串,就像彩票兑奖一样,是逐字逐个规则匹配。不但内容要符合规则,位数首先要一致
- 示例:车牌号正则表达式规则(例如:京A·BC345)
[\u4e00-\u9fa5][A-Z]·[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]
- 数量词,是专门规定一个字符集出现次数的规则
- 今后,只要一个字符集在规则中可能连续反复出现多次,就要用数量词以简写方式定义出现次数。
- 如何:数量词紧跟在其修饰的字符集之后,默认修饰相邻的前一个字符集
- 比如:手机号中连续的9个数字\d,可进一步简写为: 1[3-9]\d{9} ——注:\d{9} = \d*9
◼️ 使用数量词
👉 在RegExp Buddy中
– 利用数量词进一步简写手机号规则
答案: 1[3-9]\d{9}
– 利用数量词进一步简写车牌号规则
答案: [\u4e00-\u9fa5][A-Z]·[0-9A-Z]{5}
- 需求:让程序自动识别出短信中的验证码
- 比如:
- 需求:让程序自动识别出短信中的验证码
- 其实,数量词包括两大类:
– 1. 有明确数量边界的数量词
字符集{n} 表示字符集必须重复n次,不能多也不能少
字符集{n,m} 表示字符集至少重复n次,最多重复m次,
n<= <=m
比如: \d{4,6} 表示4到6位数字
字符集{n,} 表示字符集匹配的内容至少重复n次,多了不限
示例:有明确数量边界的数量词
\d{3} =3个\d{3,5} 3个<= <=5个\d{3,} 3个<=
– 2. 没有明确数量边界的数量词
* 可有可无,多了不限 0个<=
? 可有可无,最多一次 0个或1个
+ 至少一次,多了不限 1个<=
示例:没有明确数量边界的数量词
\s * 0个<= 的空格\s + 1个<=的空格\s? 0个或1个空格
◼️ 使用不确定数量的数量词
👉 在RegExp Buddy中
– 匹配手机短信中的验证码:连续的4位~6位数字
答案: \d{4,6}
– 匹配字符串中的一组连续空字符
答案: \s+
6. 选择和分组
- 问题:屏蔽敏感词时,屌丝把字换成拼音就查不出来了
- 错误的做法: 直接将拼音放入[]中作为字符集中的备选
- 比如:[草cao]
- 希望: 草 或 cao
- 其实:字符集只认识单个字,不认识一组拼音
- 正确做法:选择
- 选择,是指在多个子规则中选其一匹配
- 今后,只要在多个子规则中选其一匹配时,就用选择
- 如何: 子规则1 | 子规则2
- 读作: 满足规则1 或 满足规则2
- “|”选择符只分左右,不考虑单个字
- 比如: 草 | cao 👉 草 ↔️ cao
- 问题:如果规则写成“我草|cao” 呢?
- 希望是:我草 或 我cao
- 实际却是: 我草 | cao 👉 我草 ↔️ cao
- 因为“|”选择符只分左右,不考虑单个字符
- 分组,将多个子规则视为一组,再和分组外的规则匹配
- 只要希望将多个子规则视为一个整体,再和其它规则匹配时,就用分组
- 如何: 其它规则 (多个子规则)
- 比如:我 (草|cao) 👉 我草 ↔️ 我cao
◼️ 使用选择和分组
- 在RegExp Buddy中定义规则
– 匹配一个“草” 字或“cao”这个拼音
答案: 草|cao
– 匹配“我草”或“我cao”
答案: 我(草|cao)
◼️ 贪婪模式与短路逻辑
- 问题:\d{4,6},当遇到6位数字时,为什么不优先匹配4位数字,而是直接匹配6位数字呢?
- 答: 默认正则表达式采用贪婪模式匹配敏感词。
- 贪婪模式: 正则表达式总是尽量匹配最长的符合正则要求的字符串。能匹配到6位,就绝不匹配4位!
- 问题: \d{6}|\d{4},既能匹配4位,又能匹配6位。但是\d{4}|\d{6},却只能匹配4位,无法匹配6位。
- 答: |不遵守贪婪模式,而是和js程序一样采用短路逻辑
- 短路逻辑: 如果前一个条件已经可以匹配字符串中的部分内容,则后一个条件不再执行!
- 需求:同时验证同音字或拼音
我 ([草艹槽]|cao) 👉 我草 ↔️ 我艹 ↔️ 我槽 ↔️ 我cao
- 需求:“我” 字也可能是“卧”或“wo”
([我卧]|wo)([草艹槽]|cao)
👉 我草 ↔️ 我艹 ↔️ 我槽 ↔️ 我cao
👉 卧草 ↔️ 卧艹 ↔️ 卧槽 ↔️ 卧cao
👉 wo草 ↔️ wo艹 ↔️ wo槽 ↔️ wocao
- 需求:“我” 字也可能是“卧”或“wo”
– 第一个字: 我 卧 wo —— ([我卧]|wo)
– 第二个字: 草 艹 槽 cao ——([草艹槽]|cao)
– 第一个字和第二个字之间有可能有空格,也可能没有空格,也可能有多个空格——\s*
([我卧]|wo)\s*([草艹槽]|cao)
– \s+ 什么防不住? 没写空格时防不住
– \s? 什么防不住? 两个以上空格防不住
- 需求: 可能在中间加不确定个数的空字符:
– 第一个字: 我 卧 wo —— ([我卧]|wo)
– 第二个字: 草 艹 槽 cao ——([草艹槽]|cao)
– 第一个字和第二个字之间有可能有空格,也可能没有空格,也可能有多个空格——\s*
([我卧]|wo)\s*([草艹槽]|cao)\
◼️ 使用选择和分组
- 在RegExp Buddy中定义规则
– 匹配“我草”
– 匹配 “卧 槽”
– 匹配 “wocao”,“我 草”等敏感词
– 定义完整手机号规则:
+86或0086
(\+86|0086) ——+是正则有功能的特殊符号,可是这里不希望+当做特殊功能使用,只当做普通字符匹配,所以用\+阻止正则解析+为数量词。
至少一个空字符 : \s+
之前所有,整体可有可无,最多一次: ()?
👉 1
👉 3~9 任选其一
👉 9位数字
答案: ((\+86|0086)\s+)?1[3-9]\d{9}
– 定义完整身份证号规则:
15位数字: \d{15}
2位数字: \d\d
最后一位: 1位数字或x: [0-9x]
最后三位 可有可无,最多一次 (最后三位)?
答案:\d{15}(\d\d[0-9x])?
匹配测试字符串: 110102200012261 时,测试通过
匹配测试字符串:110102200012261251,测试通过
11010220001226125 不是合法的
– 匹配“微信”,“weixin”,“w x”等情况,并防止中间加空格
– 不用防wechat
答案:(微|w(ei)?)\s*(信|x(in)?)
分析:(微|w(ei)?)汉字微或拼音wei,但是ei可有可无,\s*可能有空格,也可能没有空 格, (信|x(in)?)汉字信或拼音xin,但是in可有可无
7. 指定匹配位置
- 一个字符串中三个位置比较特殊:
–1. 字符串开头
–2. 字符串结尾
–3. 英文句子中的每个单词中间的空白位置
- 如果只希望匹配特殊位置上的关键词时,就可用特殊符号表示特殊位置。
- 包括:
–1. ^ 表示字符串开头
–2. $ 表示字符串结尾
–3. \b 表示单词边界,可匹配:空格,标点符号,字符串开头和结尾等可将一个单词与其它单 词分割开的符号。
- 比如:
- 比如:匹配一组连续的空字符
–1. 匹配任意一组连续的空字符 \s+
–2. 仅匹配开头的空字符 ^\s+
–3. 仅匹配结尾的空字符 \s+$
–4. 同时匹配开头和结尾的空字符:
错误的做法: ^\s+$表示从开头到结尾之间只能是空字符 😅 ^ …中间只能有空格… $
正确做法: ^\s+|\s+$用“|”选择符,将整个规则强行一分为2 😀^\s+ ↔️ \s+$
– 一个正则,从字符串开头开始向后匹配
– 共经历过两次匹配的,发现字符串中有两组符合要求的空格
执行过程如下:
- 再比如: 找到每个单词首字母
——前边紧挨着单词边界的字母
- 所以:\b[a-z]
- 问题: 只写\b什么也匹配不到
- 原因: 其实\b是”零宽”,只匹配位置,不匹配字符
◼️ 使用特殊位置
- 在RegExp Buddy中定义规则
– 仅匹配字符串开头的空字符 👉 ^\s+
– 仅匹配字符串结尾的空字符 👉 \s+$
– 同时匹配字符串开头和结尾的空字符 👉 ^\s+|\s+$
– 匹配每个单词首字母 👉 \b[a-zA-Z]
◼️ 练习:电子邮件的正则表达式
- 使用正则匹配电子邮件
答案:\w+@\w+\.\w+(\.cn)?
分析:电子邮件的正则表达式
➡️ \w+ 1个以上的合法字符
➡️ @ 必须有一个@
➡️ \. 必须有一个.但是.是通配符,要转义为\.
➡️ \w+ .后至少有一个后缀是一个以上的合法字符
➡️ \.cn 最后的.cn可有可无。
😀 所以完整的邮箱正则表达式是:\w+@\w+\.\w+(\.cn)?
💠 总结:知识点提炼
⏬ 只要验证字符串格式或查找、屏蔽敏感词时都要用正则 ⏬
(1). 最简单的正则: 一个敏感词的原文
(2). 某一位字符上可能有多种备选字时用: [备选字列表]
(3). 如果[]中部分字符是连续的,可用: [x-x]
a. 一位小写字母: [a-z]
b. 一位大写字母: [A-Z]
c. 一位字母(大小写都行): [A-Za-z]
d. 一位字母或数字都行: [0-9A-Za-z]
e. 一位汉字: [\u4e00-\u9fa5]
(4). 预定义字符集:
a. \d 一位数字
b. \w 一位数字、字母或_
c. \s 空格、tab、换行等空字符
d. . 任意字符
(5). 如果规定一个字符集或子规则反复出现的次数时就用量词:
a. 有明确数量边界的量词:
1). {n} =n 必须n个,不能多也不能少
2). {n,m} n个<= <=m个
3). {n,} n个<= 多了不限
b. 没有明确数量边界的量词:
1). * 0个<= 可有可无,多了不限
2). ? 0个或1个 可有可无,最多一个
3). + 1个<= 至少一个,多个不限
(6). 两个规则中选其一匹配即可: 规则1|规则2
(7).希望将多个子规则分为一组先联合匹配,再和分组外的其他规则联合匹配:
(多个子规则)
(8). 匹配特殊位置: 3个
a. 字符串的开头位置: ^
b. 字符串的结尾位置: $
c. 英文句子中的单词的左右边界: \b
如果这篇【文章】有帮助到你,希望可以给【青春木鱼】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【前端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️【青春木鱼】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!