本博客使用的语言为 JavaScirpt
1. 正则表达式 (Regular Expression)
1.1 作用
1. 验证字符串是否符合规则
2. 从字符串中获取一部分符合规则的内容
1.2 语法
- 使用特定字符组成一个表达式
- 用这个表达式验证字符串,或从字符串中截取内容
1.3 创建方法
- 字面量创建:
let reg = /abcd/;
- 构造函数创建:
let reg = new RegExp('abcd');
作用:校验字符串中是否包含字串“abcd”
1.3.1 元字符
组成正则表达式的基本符号
普通元字符 | |
\s | 表示一个空格 |
\S | 表示一个非空格 |
\t | 表示一个制表符 |
\d | 表示一个数字 |
\D | 表示一个非数字 |
\w | 表示一个数字、字母、下划线必有其一 |
\W | 表示有除数字、字母、下划线外的其它字符 |
. | 表示有非换行的任意字符 |
\ | 转义符 |
边界元字符 | |
^ | 表示字符串的开始 |
$ | 表示字符串的结束 |
限定元字符 | 写在普通元字符或字母符号的后面,限制一个符号出现的次数 |
* | 表示出现 0 ~ 多 次 |
+ | 表示出现 1 ~ 多 次 |
? | 表示出现 0 ~ 1 次 |
{n} | 表示出现 n 次 |
{n,} | 表示出现 n ~ 多 次 |
{n,m} | 表示出现 n ~ m 次 |
`*?` `+?` `??` `{n}?` `{n,}?` `{n,m}?` | 这六个为非贪婪匹配 |
1.3.2 简单举例
// 字符串中必须有一个空格
let reg = /\s/
console.log(reg.test("123"), reg.test("1 23"))
// 字符串中必须有一个非空格
reg = /\S/
console.log(reg.test(" "), reg.test("1 "))
// 字符串中必须有一个数字
reg = /\d/
console.log(reg.test("abcdefg"), reg.test("abc1defg"))
// 字符串中必须有一个非数字
reg = /\D/
console.log(reg.test("abcdefg"), reg.test("abc1defg"))
// 字符串中数字、字母、下划线必有其一
reg = /\w/
console.log(reg.test("abcdefg"), reg.test("abc1defg"))
/**
* 边界元字符
*/
// 字符串必须以一个一个数字开头
reg = /^\d/;
console.log(reg.test("1hganijg"), reg.test("gjaoigh2bhes"))
// 字符串只能有一个数字
reg = /^\d$/;
console.log(reg.test("a"), reg.test("2"))
// 字符串有两个数字组成
reg = /^\d\d$/;
console.log(reg.test("55"))
/**
* 限定元字符
*/
// 字符串中出现 0 ~ 多个数字组成的片段
reg = /\d*/;
console.log(reg.test("goan2156156faga"), reg.test("1516"), reg.test("ga15gasrg1515gs1515"), reg.test("gsg"))
// 字符串只能由数字(个数:0 ~ )组成
reg = /^\d*$/;
console.log(reg.test("goan2156156faga"), reg.test("1516"), reg.test("ga15gasrg1515gs1515"), reg.test("gsg"))
// 字符串只能由3个数字组成
reg = /^\d{3}$/;
console.log(reg.test(""), reg.test("0"), reg.test("12"), reg.test("123"), reg.test("11234"))
1.4 方法
1.4.1 RegExp对象.test(待检测字符串)
返回值:true、false
1.4.2 RegExp对象.exec(待截取字符串)
返回值:
- 没有截取到片段 => null
- 截取到片段
返回一个数组- 索引 0 是截取到的片段(只截取符合条件的第一个子串)
1.5 小应用
1.5.1 捕获一段 html 结构的字符串
let str = '<div style="" class=""><span></span></div>'
let reg = /<.+>/;
console.log(reg.exec(str)) // 截取到的字符为:<div style="" class=""><span></span></div>
reg = /<.+?>/;
console.log(reg.exec(str)) // 截取到的字符为:<div style="" class="">
str = '<div style="" class=""><span></span></div'
reg = /<.+>/;
console.log(reg.exec(str)) // 截取到的字符为:<div style="" class=""><span></span>
1.5.2
// 字符串必须以abc开头、2~多个d结尾
let reg = /^abcd{2}$/;
console.log(reg.test("abcddsa"), reg.test("abcddd"))
1.6 特殊的元字符
1.6.1 特殊的元字符
() | 将()中的内容作为一个整体 |
单独截取 | |
(?:) | 整体匹配但不截取 |
| | 占位或 |
表示左边与右边都行,分为两个整体 | |
[] | 一个 [] 占一个字符位置 |
表示里面的任意一个都行 | |
[^] | 一个 [^] 占一个字符位置 |
表示非里面的任意一个都行 | |
- | 使用在 [] 里面的一个符号 |
表示至或到,从哪一个字符到哪一个字符,要求字符在 ASCII 表中连续 |
1.6.2 举例
// ()
let reg = /abcd{2}/;
console.log(reg.test("abcdd"))
reg = /(abcd){2}/;
console.log(reg.test("abcdabcd"))
reg = /\d+(\s+)\d+/;
console.log(reg.exec("123 123"))
reg = /(\d+(\s+))\d+/;
console.log(reg.exec("123 123"))
// (?:)
reg = /\d+(?:\s+\d+)/;
console.log(reg.exec("123 123"))
reg = /\d+(?:\s+\d+){2}/;
console.log(reg.exec("123 123 123"))
// |
reg = /(abc|def)/;
console.log(reg.test("abc"), reg.test("def"), reg.test("a"))
reg = /^abc|def$/;
console.log(reg.test('abc'), reg.test('def'), reg.test('abcdef'))
reg = /^ab(c|d)ef$/;
console.log(reg.test('abc'), reg.test('def'), reg.test('abcdefg'), reg.test('aaaadef'), reg.test('abcef'))
/**
* []
*/
// 字符串中包含 a 或 b 或 c 或 d
reg = /[abcd]/
console.log(reg.test('moimomamomoi'))
// 字符串为:a 或 b 或 c 或 d
reg = /^[abcd]$/
console.log(reg.test('moimomamomoi'))
/**
* [^]
*/
// 字符串由一个字符组成,但不是 a 或 b 或 c 或 d
reg = /^[^abcd]$/
/**
* -
*/
// 字符串由一个字符组成,0 ~ 9 的任一个数字
reg = /^[0-9]$/
1.6.3 小练习
/**
* ()表示一个整体,这个整体是 abc 或 def
* {2} 表示这个整体出现两次,只要两个整体就行
*/
let reg = /!(abc|def){2}$/
console.log(reg.test("abcabc"), reg.test("defdef"), reg.test("abcdef"), reg.test("defabc")) // 都是 true
/**
* 验证一个字符串:它只能与数字、字母、下划线组成,6~12 位,不能以 _ 开头
*/
let reg = /^[^_]\w{5,11}$/
1.6.4 特殊元字符表示普通元字符
[0-9a-zA-Z_] | \w |
[^0-9a-zA-Z_] | \W |
[0-9] | \d |
[^0-9] | \D |
[ ] | \s |
[^ ] | \S |
[.] | 仅表示一个点字符 |
1.6.5 重复的元字符 —— \num
/num (num 表示一个正整数)
- num 是一个数字,表示的是正则表达式中第 num 个可被捕获的 ()
- 这个可捕获的小括号位置是什么,
\num
处出现一份一模一样的内容
1.6.5.1 举例
let reg = /^(abc|def)\d+\1$/
console.log(reg.test("abc123abc"), reg.test('abc123def')) // true false
reg = /^([abcd])\d+([abcd])\d+\1\2$/
console.log(reg.test('a123b123ab')) // true
reg = /^(?:[abcd])\d+([abcd])\d+\1$/
console.log(reg.test('a123b123a'), reg.test('a123b123b')) // false true
1.7 正则标识符
标识符写在正则表达式的外面,修师整个标识符
1.7.1 标识符
i | 忽略全局大小写 |
g | 全局标识符 匹配和捕获的时候,都是只能找到第一个 当他有全局标识符的时候,你捕获第二次会从第一次的结束位开始查找 直到找不到了,返回null 再后面依次的时候,又回到[e]位置开始捕获 匹配和捕获都是影响下一次开始位的 |
y | 粘性全局标识符 每一次捕获的时候 第一次必须是从[0]位置就刚好能捕获到内容 第二次必须是从第一次结束位开始就刚好能捕获到内容才可以 |
1.7.2 使用
/abcd/igy
new RegExp('abcd', 'igy')
1.7.3 简单举例
let reg = /^[abcd]*$/
console.log(reg.test('abdcdA'))
reg = /^[abcd]*$/i
console.log(reg.test('abdcdA'))
let str = 'abc123abc456abc789abc'
reg = /\d{3}/g
console.Log(reg.exec(str))//结束位是[5]
consoLe.Log(reg.exec(str))//开始位就是[6]
consoLe.Log(reg.test(str))//开始位就是[12]
consoLe.Log(reg.exec(str))//开始位就是[15]
consoLe.Log(reg.exec(str))//开始位就是[o]
str = '123456abc789abc'
reg = /\d{3}/y
// console.Log(reg.exec(str)) l/ g 123
// consoLe.Log(reg.exec(str)) l/ g 456
console.log(reg.exec(str) // 123
console.log(reg.exec(str)) // 456