目录
3. str.replace(regexp|substr, newSubStr|function)
一. 正则表达式简介
1. 什么是正则表达式?
正则表达式(Regular Expression):一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
正则表达式 是一种 字符串搜索 和 匹配 的工具
2. 为什么要用正则表达式?
典型的搜索和替换操作,要求用户提供:与预期搜索结果 完全匹配的 确切文本
因此,缺乏灵活性,采用这种方法搜索动态文本,会变得很困难
3. 正则表达式的几种风格(标准)
- grep
- egrep
- POSIX
- Perl
- PCRE
二. 基本语法
正则表达式测试工具
http://reg.1zdz.cnhttp://reg.1zdz.cn/
1. 界定符
界定符:表示一个正则表达式的开始和结束
1.1 界定符的几种写法
- / 正则表达式 /
- # 正则表达式 #
- { 正则表达式 }
在 JavaScript 中,界定符以斜线(/
)开始和结束
const reg = /正则表达式/;
字符串是通过单引号或者双引号界定,那么正则的界定就好理解了吧
2. 原子
原子:正则表达式中最小的匹配单位
2.1 原子的分类
- 可见原子:/A/ /,/ / /
- 不可见原子:空格、\n、\t、\r
const reg = /A/;
const reg = /,/;
const reg = / /;
以上正则表达式中,均只有一个原子
一篇文章的最小单位是一个文字或者一个单词,他们组合在一起就是一篇文章,正则表达式也是有原子组合而来的
2.2 汉字匹配问题
汉字先转换成 Unicode 编码,再写入正则表达式中,进行匹配
2.3 关于转义
匹配某些符号(被正则表达式使用的符号)
\$、\.、\+、\\、/[.]/
2.4 元字符是什么
元字符:一系列原子集合
元字符作用:定义原子的筛选方式;对某一类原子归类缩写;
2.5 元字符三种类型
或:原子 | 原子(例如:/t|T/)
任一:[原子原子...](例如:/[tT]/)
常见的 “任一” 正则表达式:[0-9] [a-z] [A-Z] [\u4e00-\u9fa5]
除此之外:[^原子原子...](例如:/[^tT]/)
原子|原子 // 表示:或(匹配其中一个原子即可)
[原子原子...] // 表示:任一(匹配括号里的任一一个原子即可,原子之间不用竖线)
[^原子原子...] // 表示:除此之外(和前一种情况相反)
中括号中,如果原子是连续的(ASCII 码),那么可以用横线(-
)表示连续:
[0123456789] = [0-9]
[abcdefghijklmn] = [a-n]
2.6 内置原子集合(元字符)
元字符 | 解释 | 等价于 |
---|---|---|
. | 除换行符之外任意一个字符 | |
\d | 匹配任意一个十进制数 | [0-9] |
\D | 匹配任意一个非十进制数 | [^0-9] |
\s | 匹配一个不可见原子 | [\f\n\r\t\v] |
\S | 匹配一个可见原子 | [^\f\n\r\t\v] |
\w | 匹配任意一个数字、字母、下划线 | [0-9a-zA-Z_] |
\W | 匹配任意一个非数字、字母、下划线 | [^0-9a-zA-Z_] |
【举个栗子】/ES\d/ -> -> -> ES0 ES1 ES5
单词可以组成一句话,文章是由很多句话组成。元字符也是对一类原子组成的一小段,最终这些元字符汇聚就可以组成正则表达式
3. 量词
量词:描述原子连续出现的次数
3.1 量词的三种写法
等于:原子{n},=n
大于等于:原子{n, },>=n
范围:原子{n, m},n <= 匹配原子 <= m
原子{n} // 表示要前面紧邻的这个原子要匹配n次
原子{n,} // 表示要前面紧邻的这个原子要匹配大于等于n次:半开半闭区间 [n, +无穷)
原子{n,m} // 表示要前面紧邻的这个原子要匹配大于等于n次,小于等于m次:[n, m]
3.2 特殊量词
特殊量词 | 解释 | 等价于 |
---|---|---|
* | 匹配>=0次之前的原子(可存在) | {0,} |
+ | 匹配1次或多次之前的原子(存在) | {1,} |
? | 匹配0次或1次之前的原子(可有可无) | {0,1} |
【举个栗子】/ES\d{4}/ ES0000 ES2018 ES2020
【举个栗子】/go{2,}gle/ gogle google goooooogle
【举个栗子】/goo+gle/ gogle google goooooogle
/ES\d{4}/ // 可以匹配到:ES000 ES2015 ES2020等
/go{2,}gle/ // 可以匹配到:google gooooooogle等
4. 边界控制
边界控制:对匹配目标位置的控制(在多行模式下匹配符合条件的行)
以
^
表示开始,以$
表示结束
^:匹配字符串开始的位置
$:匹配字符串结束的位置
/go{2,}gle/ // "This is google website!" 可以匹配
/^go{2,}gle/ // "This is google website!" 匹配失败
// "google" 可以匹配
此外,边界控制还有模式单元()
,小括号的作用可以将整体作为一个原子
[Dd](
// 2个原子
D | d
); // 1个原子
5. 修正模式
修正模式:给正则表达式的匹配过程设定一种模式
修正表达式 | 解释 |
---|---|
i | 忽略字母大小写 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) |
m | 执行多行匹配 |
【举个栗子】忽略大小写 —— / 正则表达式 /i
【举个栗子】/ES\d/i —— ES5 es5 Es5 eS5
6. 贪婪模式、懒惰模式
贪婪模式:在条件允许的范围内,利益最大化(得寸进尺) tasssssssshk s+
懒惰模式:达到最低标准就完事了,懒得动弹(不思进取) tasssssssshk s+?
【举个栗子】一共五个手机,你可以选择1-5个,贪婪模式会选择5个,懒惰模式只会选择一个
用法:量词后面加?
表示懒惰模式
tasssssk /s+/ 匹配结果:sssss (贪婪模式,可以匹配1个以上的s,那就全匹配)
tasssssk /s+?/ 匹配结果:s (懒惰模式,可以匹配1个以上的s,那最低标准1个s)
贪婪模式 | 懒惰模式 | 解释 |
---|---|---|
? | ?? | 匹配0个或1个 |
+ | +? | 匹配1个或多个 |
* | *? | 匹配0个或多个 |
{n} | {n}? | 匹配n个 |
{n,m} | {n,m}? | 匹配n个或者m个 |
{n,} | {n,}? | 匹配n个或者多个 |
7. 关于 ?
7.1 (?=) 和 (?!) → 正向断言 和 负向断言
正向断言:
(?=原子)
表示后面必须接正向断言的原子,且匹配结果不包括该原子负向断言:
(?!原子)
表示后面不能接正向断言的原子,匹配结果不包括该原子
/string(?=s)/ 可以匹配:strings (匹配结果:stirng) 不可以匹配:stringS stringa
/string(?!s)/ 可以匹配:stringS (匹配结果:string) 不可以匹配:strings
7.2 ?: 可以产生没有编号的分组
正则:/(ab)c(ba)/ /(?:ab)c(ba)/ /((a)(b))(c)/
编号: 1 2 1 1 2
三. 常用正则表达式设计
1. 设计思路
- 需求分析(匹配11位手机号)
- 语言描述(1开头、第二位是3,4,5,6,7,8、再接上任意9位数字)
- 写出正则表达式(上面三个条件得到 —— 1、[345678]、\d{9},拼接后得 /^1[345678]\d{9}$/ 或者 /^1(3|4|5|6|7|8)\d{9}$/)
2. 常用正则表达式
需求 | 正则表达式 |
---|---|
数字 | ^[0-9]*$ |
汉字 | ^[\u4e00-\u9fa5]{0,}$ |
Email地址 | ^\w+([-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
InternetURL | [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
手机号码 | ^(13[0-9]|14[5|7]|15[0-9]|18[0-9])\d{8}$ |
身份证号(15位、18位数字) | ^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$ |
IP地址 | ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)) |
腾讯QQ号 | [1-9][0-9]{4,} (腾讯QQ号从10000开始) |
四. JavaScript 正则表达式方法
1. 常见正则表达式方法
方法 | 返回值 | 功能 |
---|---|---|
RegExp.test(str: string) | boolean | 检测一个字符串是否匹配某个模式 如果字符串中含有匹配的文本,则返回 true,否则返回 false |
RegExp.exec(str: string) | string [] | 检索字符串中的正则表达式的匹配 |
RegExp.toString() | string | 正则表达式的字符串值 |
String.search() | number | 检索指定字符串,返回第一次匹配位置,没找到-1 |
String.match() | array | 检索指定的值,或找到一个或多个正则表达式的匹配 |
String.replace() | string | 检索指定的值并替换 |
String.split() | array | 把一个字符串分割成字符串数组 |
2. regexObj.test(str)
function checkMobile(num) {
const regRule: RegExp = /^1[3-9]\d{9}$/;
return regRule.test(String(num));
}
3. str.replace(regexp|substr, newSubStr|function)
$n: 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始。如果不存在第 n个分组,那么将会把匹配到到内容替换为字面量。比如不存在第3个分组,就会用“$3”替换匹配到的内容