正则表达式 RegExp
一、正则表达式的概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
二、正则表达式的组成
正则表达式由元字符,字符类,和量词组成 /^([字符类]{量词})([字符类]{量词})$/
三、正则对象 RegExp
- 通过new 关键字声明正则对象
// 正则规则: 可以是字符串类型,也可以是正则
var patt = new RegExp(正则规则, 修饰符)
var patt = new RegExp('a', 'g')
var patt = new RegExp(/a/, 'g')
- 字面量的形式
var patt = /正则规则/修饰符
两种方式的区别
字面量形式不能接受变量
四、正则对象的方法
-
test() : 执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。
-
exec() : 在一个指定字符串中执行一个搜索匹配。返回一个结果数组(包含所有匹配的结果)或 null(没有匹配则为null)。如果要检索出所有匹配的结果,则需要使用循环
该方法在执行时,通过lastIndex属性会纪录每次匹配结束的位置,下次执行则从lastIndex纪录的位置开始; 找不到匹配的结果时,lastIndex属性会重置为0, 从头开始
var patt = /o/g;
var str = 'hello world oo';
var res1 = patt.exec(str)
var res2 = patt.exec(str)
var res3 = patt.exec(str)
// 借助循环获取所有的结果
let res;
while(res = patt.exec(str)){
console.log(res)
}
五、修饰符
- g : 全局匹配
- i : 不区分大小写
- m : 多行匹配
六、元字符
- ^ : 匹配以什么作为开始
- $ : 匹配一什么作为结束
- () : 分组或者反向引用
- | : 或
七、字符类
- [xyz] : 字符类的集合, 匹配方括号中的任意字符
- [^xyz] : 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符
在字符类中可以使用-
表示范围的集合 - [0-9] : 匹配数字0 到 9
- [a-z] : 匹配小写字母
- [A-Z] : 匹配大写字母
- [A-Za-z] : 匹配大小写字母
- [A-Za-z0-9] : 匹配大小写字母以及数字
.
: 默认匹配除换行符之外的任何单个字符。
针对常用的匹配规则,可以使用简写等价形式
-
\w : 等价形式 [A-Za-z0-9_]
-
\W : 匹配一个非单字字符。等价于 [^A-Za-z0-9_]
-
\d : 等价于 [0-9]
-
\D :匹配一个非数字字符 等价于 [^0-9]
-
\s : 匹配任意的空白符
-
\S :除了空白符以外的
八、量词
量词限定字符类出现的次数; 量词分为贪婪的和惰性的
*
: 匹配0次或者多次 , 等价形式 {0,}+
: 匹配1次或者多次 , 等价形式 {1,}?
: 匹配0次或者1次 , 等价形式 {0,1}- {n} : 匹配n次
- {n,} : 至少匹配n次,最多不限
- {n,m} : 最少匹配n次, 最多m次
九、转义字符 \
如果在正则表达式中匹配 需要匹配特殊的字符(正则规则中使用的字符), 需要借助于 转义字符 \特殊字符
; 有时候为了避免出现不可控问题,需要使用双重转义\\字符
十、分组
() 分组和反向引用;
只分组不引用: ?:()
反向引用
反向引用 引用的是匹配的结果,而不是匹配的规则
反向引用 \n
数字n 是左括号的顺序
// 反向引用
var patt = /^<(h1)>\w{1,}<\/\1>/
var str = '<h1>hello</h1>';
var res = patt.test(str)
// 只分组, 不引用
var patt = /^((?:(ECMA)Script)Hello)$/
var str = 'ECMAScriptHello';
var res = patt.test(str);
// 反向引用 $n : n 是左括号的顺序; 如果是正则对象的属性,使用 $n; 如果在正则表达式中使用,则使用 \n
console.log(RegExp.$1);
console.log(RegExp.$2);
console.log(RegExp.$3);
console.log(RegExp.$4);
十一、或
var patt = /hello(red)|(black)/
var patt = /hello[a|b]/
十二、断言
- x(?=y) :匹配’x’仅仅当’x’后面跟着’y’.这种叫做先行断言(正向前瞻)。
- x(?!y) : 仅仅当’x’后面不跟着’y’时匹配’x’,这被称为正向否定查找(负向前瞻)。
十三、匹配模式
正则规则的匹配模式有两种: 贪婪模式和惰性模式
- 贪婪模式: 尽可能多的去匹配
var str = '123456789012345678900';
var res = str.match(/\d{3,6}/g);
- 惰性模式: 尽可能少的去匹配
可以在贪婪模式的后边添加 ? 变成惰性模式+? *? {n,}? {n,m}? ??
var str = '123456789012345678900';
var res = str.match(/\d{3,6}?/g);
十四、字符串中和正则相关的方法
- replace():替换与正则表达式匹配的字符串; 默认替换的是第一次匹配的字符串; 如果要替换全部得 ,则需要全局匹配
'hello world'.replace(/o/, 'javascript')// 默认替换第一个
'hello world'.replace(/o/g, 'javascript') // 全部替换
- match() :找到一个或者多个正则表达式匹配的结果数组,
var str = 'hella world';
// let res = str.match(/o/g); // 如果有全局修饰符g 结果是一个数组 ['o', 'o']
let res = str.match(/o/);
console.log(res);
/* // 没有全局修饰符g的结果解析:
0: "o" // 索引值 匹配的结果(数组中的内容的索引值)
groups: undefined
index: 4 // 匹配的字符在指定的字符串中第一次出现位置的索引值
input: "hello world" // 匹配的指定的字符
length: 1 // 数组的长度
*/
- search() :匹配指定的字符串中是否含有指定的字符; 它返回匹配到的位置索引,或者在失败时返回-1。
var str = 'hello';
// var res = str.search(/e/)
var res = str.search(/a/)
console.log(res);
- split() : 字符串的分割
var str = 'haksdf2324hwehej2313jkfghwer5345634adf';
var res = str.split(/\d{1,}/)
console.log(res);