1 正则表达式
使用单个字符串来描述、匹配一系列符号某个句法规则的字符串,可以简单理解为按照某种规则去匹配符合条件的字符串。
Ps:https://regexper.com/ 可帮助理解正则表达式,正则表达式工具
2 regexp对象
JavaScript通过内置对象RegExp支持正则表达式,有两种方法实例化RegExp对象:字面量、构造函数
3 预定义类
. 等价于 [^ ] 即除了回车符和换行符之外的所有字符
d 等价于[0-9] 即数字字符
D 等价于[^0-9] 即非数字字符
s 等价于[ x0Bf ] 即空白符
S 等价于[^ x0Bf ] 即非空白符
w 等价于[A-Za-z_0-9] 即单词字符
W 等价于[^a-Za-z_0-9] 即非单词字符
4 边界字符
^ 即以xxx开始
$ 即以xxx结束
即单词边界
B 即非单词边界
5 量词
? 即出现0次或1次,最多1次
+ 即出现1次或多次,最少1次
* 即出现0次或多次,任意次
{n} 即出现n次
{n,m} 即出现n到m次
{n,} 即至少出现n次
6 贪婪模式
d{3,6} //尽可能多的匹配
7 非贪婪模式
让正则表达式尽可能少的匹配,即一旦匹配成功匹配不再继续尝试。在量词后面加上?即可。
‘123456789’.match(/d{3,5}?/g)
8 分组
使用()可以达到分组的功能,使量词作用于分组
(Byron){3}
9 或
使用|可以达到或的效果
Byron|Casper Byr(on|Ca)sper
10 反向引用
2015-12-25 =》 12/25/2015
‘2015-12-25’.replace(/(d{4})-(d{2})-(d{2})/g,’$2$3$1’)
11 忽略分组
不希望捕获某些分组,只需要在分组内加上?:即可
(?:Byron).(ok)
12 前瞻
正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”。前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言。
符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配。
正向前瞻:exp(?=asser)
负向前瞻:exp(!=asser)
console.log('a2*3'.replace(/w(?=d)/g,'x')); //x2*3 console.log('a2*34v8'.replace(/w(?=d)/g,'x'));//x2*x4x8 console.log('a2*34vv'.replace(/w(?=d)/g,'x'));//x2*x4vv console.log('a2*34vv'.replace(/w(?!d)/g,'x'));//ax*3xxx
13 对象属性
global:是否全局搜索,默认false;
ignore:是否大小写敏感,默认false;
multiline:多行搜索,默认值false;
lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置
source:正则表达式的文本字符串;
14 正则对象方法
(1) RegExp.prototype.exec(str):使用正则表达式对字符串执行搜索,并将更新全局RegExp对象的书写以匹配结果。如果没有匹配的文本则返回null,否则返回一个结果数组。Index声明匹配文本的第一个字符的位置;input存放检索的字符串string。
非全局调用:调用非全局的RegExp对象的exec()时,返回数组;第一个元素是与正则表达式相匹配的文本,第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话),第三个元素是与RegExp对象的第二个子表达式相匹配的文本(如果有的话),以此类推。
var reg3=/d(w)d/; var reg4=/d(w)d/g; var ts='1a2b3c4d5e'; var ret=reg3.exec(ts); console.log(reg3.lastIndex + ' ' + ret.index + ' ' + ret.toString());//0 0 1a2,a console.log(reg3.lastIndex + ' ' + ret.index + ' ' + ret.toString());//0 0 1a2,a while(ret = reg4.exec(ts)){ console.log(reg4.lastIndex + ' ' + ret.index + ' ' + ret.toString());//3 0 1a2,a //7 4 3c4,c }
(2)RegExp.prototype.test(str):用于测试字符串参数中是否存在匹配正则表达式模式的字符串。如果存在则返回true,否则返回false。
14 string与正则相关方法
(1)String.prototype.search(reg):用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串;方法返回第一个匹配结果index,查找不到返回-1;search()方法不执行全局匹配,它将忽略g标志,且总是从字符串的开始进行检索。
console.log("javascript".search(/script/i));//4
(2)String.prototype.match(reg):match()方法将检索字符串,以找到一个或多个与regexp匹配的文本;regexp是否具有标志g对结果影响很大。
如果regexp没有g标志,则match()方法就只能在字符串中执行一次匹配;如果没有找到任何匹配的文本,将返回null,否则返回一个数组,其中存放了与它找到的匹配文本有关的信息。返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本;除了常规的数组元素外,返回的数组还包括2个对象属性,index声明匹配文本的起始字符在字符串的位置,input声明对stringObject的引用。
如果regexp具有全局标志g,则match()方法将执行全局检索,找到字符串中的所有匹配子字符串;没有找到任何匹配的子串则返回null,如果找到了一个或多个匹配子串,则返回一个数组。数组元素中存放是字符串中所有的匹配子串,且没有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', index: 1, input: '$1a2b3c4d5e' ] console.log(ret.index + ' ' +reg3.lastIndex);//1 0 ret = ts.match(reg4); console.log(ret);//[ '1a2', '3c4' ] console.log(ret.index + ' ' + reg4.lastIndex);//undefined 0
(3)String.prototype.split(reg):经常使用split()方法将字符串分割为字符数组,
console.log('a,b,c,d'.split(',')); //[“a”,”b”,”c”,”d”] console.log('a1b2c3d'.split(/d/)); //[“a”,”b”,”c”,”d”]
(4)String.prototype.replace():
String.prototype.replace(str,replaceStr); String.prototype.replace(reg,replaceStr) String.prototype.replace(reg,function)
其中,function参数含义,function会在每次匹配替换的时候调用,有四个参数:匹配字符串、正则表达式分组内容,没有分组则没有该参数、匹配项在字符串中的index、原字符串。