with (javascript)
前一篇浅入正则(一)相识了实例化一个RegExp对象、RegExp的原型要领、RegExp的对象属性这些基本,大抵晓得正则怎样用,这一篇主要想相识一下正则怎样写。
元字符
元字符表随意就查获得,但这是会写正则最主要的基本,这里简朴分红两类并按我的明白简朴解释。
运算符 & 限定符
{
"\": "除语义类元字符中的运用,\ 为转义字符,比方想要婚配一个'(',直接运用'('会被认作分组的最先,须要运用\转义, '/\(/'",
"^": {
"开首": "在非'[]'中运用,示意婚配开首的意义,如果RegExp对象设置多行(m)属性,也会婚配换行符\n及\r以后的位置",
"非": "在'[]'中,示意取反,比方:'/[^a]/',示意婚配不是a的字符"
},
"$": "婚配完毕的位置,如果RegExp对象设置多行(m)属性,也会婚配换行符\n及\r之前的位置",
"*": "恣意的意义,示意婚配前面紧接着的子表达式0次或屡次",
"+": "示意婚配前面紧接着的子表达式1次或屡次,也就是起码1次",
"?": {
1: "示意婚配前面紧接着的子表达式0次或1次,也就是最多1次",
2: "非贪欲形式:条件是紧跟在其他限定符背面,比方'*'、'+'、'{n,m}'等,示意尽量少的婚配,比方'{n,m}',比方: '/\d{4,6}?/g',如果运用这个正则test一段字符串'123456abc',则会尽量少的婚配,也就是每次test只婚配4个,然后lastIndex被置为4,默许状况下为贪欲形式,每次会婚配6个,lastIndex会重置为6,如果没法婚配6个才会尝试婚配5个,4个"
},
"{n}": "示意婚配前面紧接着的子表达式n次,n为非负整数",
"{n,}": "示意婚配前面紧接着的子表达式n次或更屡次,也就是起码n次,n为非负整数",
"{n,m}": "示意婚配前面紧接着的子表达式n次到m次,也就是起码婚配n次,最多婚配m次,n <= m 且n和m均为非负整数",
".": "除'\n'外的恣意字符",
"|": "或,比方'/a|bcd/'能够婚配'a'或许'bcd','/(a|b)cd/'能够婚配'acd'或许'bcd'",
"-": "仅当在'[]'中能够示意连接符,'/[a-z]/'、'/A-Z/'、'/0-9/'离别示意a到z、A到Z、0到9,其他时候就示意中划线",
"[]": "字符鸠合,示意中括号中的恣意字符,比方'/[acb123ABC]/'示意婚配到'acb123ABC'中恣意一个就能够",
"()": "分组,和我们寻常的加减运算中的()差不多,能够明白为肯定优先级的意义,不过js正则中的()分组能够经由过程'$1 - $9'猎取婚配效果中,每个分组对应的婚配值,也就是'$1'也就是第一个分组的子表达式婚配胜利的效果,比方:'abc123ef'.replace(/(\w)(\d){3}/g,'$2$1'),例子中,婚配(一个字母)紧接着(一个数字)轮回了三次,'$1'就是背面紧接着数字的一个字母,也就是'c','$2'就是一个数字,也就是'(\d)'的末了一个婚配效果'3',由于数字轮回了三次,所以三个数字会被替代成'$1',而c会被替代成'$2',效果就是'ab3cef'",
"(?:)": "和()差不多一个意义,只是()中的分组内容不会被存储到'$1 - $9'的鸠合中",
"(?=)": "正向前瞻,也就是前面的表达式紧接着的表达式,要相符(?=)的=背面随着的表达式,比方:'/[a-z](?=\d)/',只会婚配背面紧接着数字的小写字母,然则数字并不会出现在婚配效果中且不会被存储到'$1 - $9'的鸠合中",
"(?!)": "负向前瞻,也就是前面的表达式紧接着的表达式,要相符(?!)的 != 背面随着的表达式,比方:'/[a-z](?!\d)/',只会婚配背面紧接着不是数字的小写字母,然则数字并不会出现在婚配效果中且不会被存储到'$1 - $9'的鸠合中"
}
基本的运算符和限定符不过就这几个,说到运算符就有优先级,上面的运算符的优先级为:
{
"一级": "'\'",
"二级": "'()'、'(?:)'、'(?=)'、'[]'",
"三级": "'*'、"+"、'?'、'{n}'、'{n,}'、'{n,m}'",
"四级": "'^'、'$'、'其他元字符及字符'",
"五级": "'|'",
}
语义类元字符
{
"\b": "单词边境,也就是前面或许背面要随着个空格",
"\B": "非单词边境,也就是必须在单词中心,前后不能有空格",
"\d": "婚配一个数字字符,等价于'[0-9]'",
"\D": "婚配一个非数字字符,等价于'[^0-9]'",
"\w": "婚配恣意单词字符和下划线'_',等价于'[a-zA-Z0-9_]'",
"\W": "婚配恣意非单词字符及非下划线,等价于'[^a-zA-Z0-9_]'",
"\s": "婚配恣意空缺字符,含空格、制表符、换页符等",
"\S": "婚配非空缺字符",
//···另有许多不常常使用的,用时再查吧
}
前一篇笔记只剖析了RegExp对象的原型要领,然则关于正则表达式,一些字符串的要领一样能够运用在正则上。
replace
replace也属于常常运用的一个要领,在详细到和正则表达式一同运用时是:stringObject.replace(RegExpObject,string|function)
,上例子:
var str1 = "2017-07-12";
var reg1 = /(\d{4})-(\d{2})-(\d{2})/g;
str1.replace(reg1, function(a,b,c,d,e){
// a/b/c/d/e离别代表: 婚配效果/第一个分组婚配值/第二个分组婚配值/第三个分组婚配值/婚配胜利的第一个字符的index值
console.log(a,b,c,d); //2017-07-12 2017 07 12,0
return c + "/" + d + "/" + b;
})
console.log(str1); //07/12/2017
须要注重的是,string是没有replaceAll的要领的,须要全局替代请在正在中设置全局属性
g
;
match
math要领也是string的要领,match要领用法和exec很类似,一样返回数组。
非全局正则挪用,输出效果和exec类似,无婚配效果则返回null,有则返回数组,离别寄存每个子表达式婚配的效果,同时具有index和input两个属性:
var reg1 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/;
//婚配 (大小写字母连着一个数字) 最少一次 (再连着汉字) 最少一次
var str1 = "a11B2老cd3李e45好";
var result = str1.match(reg1);
console.log(result); //["B2老", "B2", "老"]
这个效果和exec的效果完全一样;
全局正则挪用,数组只寄存一切婚配的全部正则的子字符串,而不寄存正则子表达式婚配的子字符串,也没有index和input的属性:
var reg2 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/g;
//婚配 (大小写字母连着一个数字) 最少一次 (再连着汉字) 最少一次
var str2 = "a11B2老cd3李e45好";
var result1 = str2.match(reg2);
var result2 = str2.match(reg2);
var result3 = str2.match(reg2);
console.log(result1,result2,result3); //["B2老", "d3李"] ["B2老", "d3李"] ["B2老", "d3李"]
console.log(result1.index,result2.input,result3); //undefined undefined ["B2老", "d3李"]
实行屡次均只输出每个婚配完全正则的子字符串,同时也没有index和input的属性。
search
search要领返回的就是正则第一次婚配胜利的最先位置,用法是stringObject.search(regexp);
同时serch要领只须要婚配胜利一次,不会重置laseIndex属性,每次都从字符串肇端位置最先搜刮,也会疏忽全局搜刮g
:
var reg3 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/g;
var reg4 = /([a-zA-Z]\d)+([\u4e00-\u9fa5])+/g;
var str3 = "a11B2老cd3李e45好";
str3.search(reg3); //3
str3.search(reg3); //3
str3.search(reg4); //3
str3.search(reg4); //3
屡次搜刮和是不是全局均不会影响搜刮效果
不论何等庞杂的正则,都是用本节中的元字符写出来的,而在庞杂的正则,用法不过也就上节和这一节中所纪录的要领。关键在于常常使用才闇练,深切才明白。这两节笔记只是浅入,在实践中探索实践才真的深切浅出,一同加油。