正则表达式
JavaScript通过内置对象RegExp支持正则表达式
有两种方法实例化RegExp对象---字面量和构造函数
字面量:replace方法
var reg = /\bis\b/g;
or:构造函数
var reg = new RegExp(/\bis\b/,'g');
'he is a boy. This is a dog.Where is she?'.replace(reg,'Is')
修饰符
g:global全文搜索,不添加,搜索到第一个匹配停止 (默认false)
i:ignore case 忽略大小写,默认大小写敏感(默认fals)
m:multiple lines多行搜索(默认fals)
l:lastIndex是当前表达式匹配内容的最后一个字符的下一个位置
s:source正则表达式的文本字符串
元字符--特殊含义
\t---水平制表符tab
\v---垂直制表符
\n---换行符
\r---回车符
\0---空字符
\f---换页符
\c[XZ]--与X对应的控制字符(Ctrl+X) (Ctrl+Z)
字符类
[]构建一个类[abc]把字符a或b或c归为一类,表达式可以匹配这类的字符
'a1b2c3d4'.replace(/[abc]/g,'x')---x1x2x3d4
字符类取反 ^ 不属于某类的内容
[^abc]表示不是字符a或b或c的内容
'a1b2c3d4'.replace(/[^abc]/g,'x')---axbxcxxx
范围类
[a-z]---a到z的任意字符
'a1b2c3d4A'.replace(/[a-zA-Z]/g,'A')---A1A2A3A4A
预定义类
.---[^\r\n] 除了回车符和换行符之外的所有字符
\d--[0-9] 数字字符
\D--[^0-9] 非数字字符
\s--[\t\n\x0B\f\r] 空白符
\S--[^\t\n\x0B\f\r]非空白符
\w--[a-zA-Z_0-9] 单词字符(字母,数字,下划线)
\W--[^a-zA-Z_0-9] 非单词字符
边界
^---以xxx开始
$---以xxx借宿
\b--单词边界
\B--非单词边界
前瞻
exp(?=assert)--正向前瞻
exp(?!assert)--负向前瞻
exp(?<=assert)-正向后顾 JavaScript不支持
exp(?<!assert)-负向后顾 JavaScript不支持
'a2*3'.replace(/\w(?=\d)/g,'X')---X2*3 单词数字
量词
?----最多一次
+----至少一次
*----任意次
{n}--出现n次
{n,m}出现n到m次
{n,}-至少出现n次
贪婪模式
'12345678'.replace(/\d{3,6}/g,'X')----X78 尽可能多的匹配
'12345678'.replace(/\d{3,6}?/g,'X')----X78 尽可能少的匹配,加个问号
分组用()
'a1b2c3d4'.replace(/([a-z]\d){3}/g,'X')---Xd4
'ByronsperByCasper'.replace(/Byr(on|Ca/)sper/g,'X') ---XX
忽略分组 ?:
(?:Byron).(ok)---ok是$1,Byron忽略了
反向引用
'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$1/$2/$3')--12/25/2015
分组后:2015为$1 12为$2 25为$3
test和exec
RegExp.prototype.test(str)
用于测试字符串参数中是否存在匹配正则表达式模式的字符串
是返回true否返回false
var reg1 = /\w/;
var reg2 = /\w/g;
reg1.test(ab); true
reg2.test(ab); true/false 因为第一个b是单词,第二个不是单词
while(reg2.test('ab')){
console.log(reg2.lastIndex);//1, 2
}
RegExp.prototype.exec(str)
使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果
没有返回null,否则返回一个结果数组
index声明匹配文本的第一个字符的位置
input存放被检索的字符串string
var reg3 = /\d(\w)(\w)/d/;
var reg4 = /\d(\w)(\w)/d/g; //g表示全局搜索
var ts = '$1az2bb3cy4dd5ee';
var ret = reg3.exec(ts);
console.log(reg3.lastIndex + '\t' + ret.index + '\t' + ret.toString());
//"0 1 1az2,a,z"后面是分组的内容
非全局下lastIndex不生效
console.log(reg3.lastIndex + '\t' + ret.index + '\t' + ret.toString());
while(ret = reg4.exec(ts))
{
console.log(reg4.lastIndex + '\t' + ret.index + '\t' + ret.toString());
//"5 1 1az2,a,z"
//"11 7 3cy4,c,y"
}
String.protatype.search(reg)
search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
方法返回第一个匹配结果,查找不到返回-1
search()方法不执行全局匹配,它忽略标志g,并且总是从字符串开始进行检索
'a1b2c3d1'.search('1') //1数字也可以,尝试转成正则
'a1b2c3d1'.search('10') //-1
'a1b2c3d1'.search(/1/g) //1
'a1b2c3d1'.search(/1/) //1
String.protatype.match(reg)
match()方法将检索字符串,找到一个或多个与regExp匹配的文本
g标志对结果有影响
非全局调用下,只进行一次匹配,返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
除了常规元素外,返回的数组还含有2个对象属性
index声明匹配文本的起始字符在字符串的位置
input声明对stringObject的引用
全局调用下没有index和input 属性
var reg3 = /\d(\w)\d/;
var reg4 = /\d(\w)\d/g;
var ts = '$1a2b3c4d5e';
var ret = ts.match(reg3);
console.log(ret);//["1a2",'a']
console.log(ret.index + '\t' + reg3.lastIndex);//"1 0"
ret = ts.match(reg4);
console.log(ret);//["1a2","3c4"]
console.log(ret.index + '\t'+ reg4.lastIndex);//"undefined 0"
String.prototype.split(reg)
把字符串分割成字符数组
'a,b,c,d'.split(','); //["a","b","c","d"]
'a1b2c3d'.split(/\d/); //["a","b","c","d"]
String.protatype.replace(str,replaceStr)
String.protatype.replace(reg,replaceStr)
String.protatype.replace(reg,function)
function会在每次匹配替换的时候调用,有四个参数
1.匹配字符串
2.正则表达式分组内容,没有分组则没有该参数
3.匹配项在字符串中的index
4.原字符串
eg1:
'a1b2c3d4e5'.replace(/\d/g, function(match, index, origin){
console.log(index);
return parseInt(match)+1;
}); ---1 3 5 7 9 "a2b3c4d5e6"
eg2:
'a1b2c3d4e5'.replace(/(\d)(\w)(\d)/g, function(match, group1, group2,group3, index, origin){
console.log(match);
return group1+group2;
}); ---1b2 3d4 "a1bc3de5"
'a1b1'.replace('1',2) ---"a2b1"
'a1b1v1'.replace(/1/g,2) ---"a2b2v2"