JavaScript的正则表达式
一、使用方式简单介绍:
1.字面量
(1)
let reg = /is/;
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));
结果:
She IS a beautiful girl.He is a handsome boy.You are a dog.
(2) 这里只替换了第一个is,如果要全局替换,在后面加个g
let reg = /is/g;
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));
结果:
She IS a beautiful girl.He IS a handsome boy.You are a dog.
2.构造函数
(1)
let reg = new RegExp('\bis\b');
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));
结果:
She IS a beautiful girl.He is a handsome boy.You are a dog.
(2) 如果要全局替换,在后面加个g
let reg = new RegExp('\bis\b', 'g');
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));
结果:
She IS a beautiful girl.He IS a handsome boy.You are a dog.
匹配符:
- g : global全局搜索,默认不添加,匹配到第一个停止
- i : ignore case忽略大小写,默认大小写敏感
- m : multiple lines多行搜索
二、元字符
- 应注意这些 * + ? $ ^ . | ( ) { } [ ]
三、字符类
1.将abc中任意字符替换成M
let reg = /[abc]/g;
let test = '1a2b3c4d';
layer.alert(test.replace(reg, 'M'));
结果:
1M2M3M4d
2.取反,除了abc以外的所有字符都替换成M
let reg = /[abc]/g;
let test = '1a2b3c4d';
layer.alert(test.replace(reg, 'M'));
结果:
MaMbMcMM
四、范围类
let reg = /[a-zA-Z]/g;
let test = '1a2b3c4d5A6F7X8Z';
layer.alert(test.replace(reg, 'M'));
结果:
1M2M3M4M5M6M7M8M
五、预定义类
- . 除了回车符和换行符以外的所有字符
- d 数字字符
- D 非数字字符
- s 空白字符
- S 非空白字符
- w 单词字符(字母、数字、下划线)
- W 非单词字符
- D 非数字字符
- D 非数字字符
- D 非数字字符
- D 非数字字符
边界匹配字符:
- ^ 以xxx开始
- $ 以xxx结尾
- 单词边界
- B 非单词边界
六、量词
- ? 至多出现一次
- + 至少出现一次
- * 出现任意次
- {n} 出现n次
- {n,m} 出现n到m次
- {n,} 至少出现n次
- {0,m} 最多出现m次
七、贪婪模式与非贪婪模式
1.贪婪模式(尽可能多的匹配)
let reg = /d{3,6}/g;
let test = '12345678';
layer.alert(test.replace(reg, 'X'));
结果:
X78
2.非贪婪模式(尽可能少的匹配)
let reg = /d{3,6}?/g;
let test = '12345678';
layer.alert(test.replace(reg, 'X'));
结果:
XX78
八、分组
1.匹配数字加小写字母连续出现3次的场景
let reg = /(d[a-z]){3}/g;
let test = '1a2b3c4d';
layer.alert(test.replace(reg, 'X'));
结果:
X4d
2.或
let reg = /1a2b3c(4d|5e)6f7g8h/g;
let test = '1a2b3c4d6f7g8h 1a2b3c5e6f7g8h';
layer.alert(test.replace(reg, 'X'));
结果:
X X
3.反向引用(捕获分组中内容)
let reg = /(d{4})-(d{2})-(d{2})/g;
let test = '2019-10-30';
layer.alert(test.replace(reg, '$2/$3/$1'));
结果:
10/30/2019
注:
let reg = /(?:d{4})-(d{2})-(d{2})/g; //忽略第一个分组
九、前瞻
例1.
let reg = /w(?=d)/g;
let test = 'a1b2c^d$';
layer.alert(test.replace(reg, 'X'));
结果:
X1X2c^d$
例2.
let reg = /w(?!d)/g;
let test = 'a1b2c^d$';
layer.alert(test.replace(reg, 'X'));
结果:
aXbXX^X$
js无后顾!!!
十、对象属性
- global : 全局搜索,默认不添加,匹配到第一个停止,默认false
- ignoreCase : 忽略大小写,默认大小写敏感,默认false
- multiline : 多行搜索,默认false
- lastIndex : 当前表达式匹配内容的最后一个字符的下一个位置
- source : 文本字符串
例:
let reg = /w/g;
layer.alert(reg.global+"</br>"+
reg.ignoreCase+"</br>"+
reg.multiline+"</br>"+
reg.lastIndex+"</br>"+
reg.source);
结果:
true
false
false
0
w
十一、test和exec方法
1.test方法,找到当前匹配位置的索引(全局调用)
let reg2 = /w/g;
let result = '';
while(reg2.test('abcdef')){
result += reg2.lastIndex + '</br>';
}
layer.alert(result);
结果:
1
2
3
4
5
6
2.exec方法
如果没有匹配的文本则返回null,否则返回一个结果数组
- index 声明匹配文本的第一个字符的位置
- input存放被检索的字符串string
(1).非全局调用
- 第一个元素是与正则表达式相匹配的文本
- 第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话)
- 第三个元素是与RegExp对象的第二个子表达式相匹配的文本(如果有的话)
- 以此类推...
例.
let reg1 = /d(w)d/;
let ts = '1a2b3c4d5e';
let ret = reg1.exec(ts);
let result = '';
result += reg1.lastIndex + ' ' + ret.index + ' ' + ret;
result += '</br>';
result += reg1.lastIndex + ' ' + ret.index + ' ' + ret;
layer.alert(result);
结果:
0 0 1a2,a
0 0 1a2,a
(2).全局调用
例.
let reg2 = /d(w)d/g;
let ts = '1a2b3c4d5e';
let ret = '';
let result = '';
while(ret = reg2.exec(ts)){
result += reg2.lastIndex + ' ' + ret.index + ' ' + ret;
result += '</br>';
}
layer.alert(result);
结果:
3 0 1a2,a
7 4 3c4,c
十二、字符串对象方法
1.search()方法
- search()方法用于检测字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
- 方法返回第一个匹配结果index,查找不到返回-1
- search()方法不执行全局匹配,它将忽略标志g,并且总是从字符串的开始进行检索
2.match()方法
- match()方法将检索字符串,以找到一个或多个与regExp匹配的文本
- regexp是否具有标志g对结果影响很大
(1).非全局调用
- 返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
- 除了常规的数组元素之外,返回的数组还含有2个对象属性
- index声明匹配文本的起始字符在字符串的位置
- input声明对stringObject的引用
例:
let reg1 = /d(w)d/;
let ts = '1a2b3c4d5e';
let ret = ts.match(reg1);
let result = '';
result += ret + ' ' + ret.index + ' ' + reg1.lastIndex;
layer.alert(result);
结果:
1a2,a 0 0
(2).全局调用
- 如果regexp具有标志g则match()方法将执行全局检索,找到字符串中的所有匹配字符串
- 没有找到任何匹配的字串,则返回null
- 如果找到了一个或多个匹配字串,则返回一个数组
- 数组元素中存放的是字符串中所有的匹配字串,而且也没有index属性或input属性
例:
let reg2 = /d(w)d/g;
let ts = '1a2b3c4d5e';
let ret = ts.match(reg2);
let result = '';
result += ret + ' ' + ret.index + ' ' + reg2.lastIndex;
layer.alert(result);
结果:
1a2,3c4 undefined 0
3.split()方法
将字符串分割为字符数组
例:
let reg1 = /d/g;
let ts = '1a2b3c4d5e';
let ret = ts.split(reg1);
console.log(ret) //layer不支持数组的弹出,所以改为console
结果:
["", "a", "b", "c", "d", "e"]
4.replace()方法
例1:
let reg1 = /1/g;
let ts = '1a1b1c1d1e';
let result = ts.replace(reg1, 2);
layer.alert(result);
结果:
2a2b2c2d2e
replace第二个参数也可以为一个function
function会在每次匹配替换的时候调用,有四个参数
(1).匹配字符串
(2).正则表达式分组内容,没有分组则没有该参数
(3).匹配项在字符串中的index
(4).原字符串
例2:没有分组
let reg1 = /d/g;
let ts = '1a2b3c4d5e';
let ret = ts.replace(reg1, function(match, index, origin){
console.log(index);
return parseInt(match)+1;
});
console.log(ret);
结果:
0
2
4
6
8
2a3b4c5d6e
例3:有分组(注意参数有变化)
let reg1 = /(d)(w)(d)/g;
let ts = '1a2b3c4d5e';
let ret = ts.replace(reg1, function(match, group1, group2, group3, origin){
console.log(match);
return group1 + group3;
});
console.log(ret);
结果:
1a2
3c4
12b34d5e