正则表达式————呱呱二号
1、正则的创建
两种方法:
let reg = new RegExp('box','ig'); //通过创建对象 let reg1 = /box/ig; //字面量表示法 typeof reg; //Object typeof reg1; //Object
字符模式修饰符:
i:忽略大小写
g:全局匹配
m:多行匹配
常用方法:
test:匹配成功返回true,失败false,
exec:成功返回数组,失败null
使用方法,正则.test('字符串');正则.exec('字符串');
例子:
let reg = new RegExp('box','ig); reg.test('This is a box'); //true
2、字符串的正则匹配方法,String对象提供的四个正则表达式的方法(一直没有搞明白以下的方法【replace,match,search,split】的使用,为什么和【test,exec】的使用方式不一样,今天总算明白了)。
replace:用replacement替换pattern
match:返回pattern中的子串或null
search:返回字符串中pattern开始的位置
split:返回字符串按指定pattern拆分的数组
'Guaguaerhao'.match(/gua/ig); //返回['Gua','gua'] 'Guaguaerhao'.replace(/gua/ig,'yi'); //替换并返回替换后的字符串,第二个参数为替换的元素 'Guaguaerhao'.search(/gua/ig); //返回匹配的位置,找不到返回 -1 'Guaguaerhao'.split(/gua/g); //返回拆分后的字符串,并组成数组 ['Gua','erhao']
3、正则的静态属性(不常用,而且浏览器兼容做得不是很好)
input:用于匹配的字符串
leftContext:匹配正则的字符串的前面的字符串
rightContext:匹配正则的字符串的后面的字符串
lastMatch:最后一次匹配的字符串
lastParen:最后一次匹配圆括号的字符串
let pattern = /gua/; pattern.test('Guaguaerhao'); //必须要先执行一次,才能使用静态属性,另外静态属性还有短名 RegExp.input; //Guaguaerhao RegExp.leftContext; //Gua RegExp.rightContext; //erhao RegExp.lastMatch; //gua RegExp.multiline; //是否开启多行匹配
4、正则的实例属性(就是实例对象的属性)
global:Boolean,表示是否已设置全局
ignoreCase:Boolean,表示是否设置不区分大小写
multiline:Boolean,是否开启多行匹配
source:String,实例属性的源字符
let pattern = /google/mgi; pattern.global; //true pattern.ignoreCase; //true pattern.multiline; //true pattern.source; //google
//以上章节内容没有多大用处,纯长长见识
5、字符
一、字符类:单个字符和数字
. :任意字符
[a-zA-Z0-9]:匹配括号中任意一个字符
[^a-zA-Z0-9]:匹配除括号中任意一个字符 //^在中括号中代表 非 ,^如果紧接着/,就是匹配开头
\d:匹配数字
\D:匹配非数字
\w:匹配字母和数字及 _
\W:匹配非字母和数字及 _ //和\w相反
二、重复字符
x?:一个或零个x
x*:0,1或更多x
x+:至少1个x
(xyz)+:匹配至少一个xyz
x{m,n}:匹配m~n个x
仨、替代字符
this | where | there :匹配this或where或there中的任意一个
四、锚元字符匹配
^:匹配开头
$:匹配结尾
\A:只有匹配字符串开始处
\b:匹配单词边界,词在[]内无效 //这个不太懂
\B:匹配非单词边界
\Z:匹配字符串结束或行尾
\z:匹配字符串结尾处
五、空白字符
\0:匹配null字符
\b:匹配空格字符
\n:匹配换行符
\r:匹配回车字符
\t:匹配制表符
\s:匹配空白字符,空格,制表符和换行符
\S:匹配非空白字符
六、记录字符
(string):用于反向引用的分组 //感觉这个比较难理解
\1或$1:匹配第一个分组的内容
\2或$2:匹配第二个分组的内容
以此类推……
栗子:
let pattern = /google{2,3}$/i; let str = 'googleee'; let str1 = 'googleeee'; pattern.test(str); //true pattern.test(str1); //false //注意对比与上一个的区别 let pattern = /(google){2,3}$/i; let str = 'googlegooglegoogle'; let str1 = 'googlegooglegooglegoogle'; pattern.test(str); //true pattern.test(str); //false let pattern = /2(.*)2/i; let str = '2haha2'; pattern.test(str);
RegExp.$1; //表示获取模式中第一个分组对应的匹配字符串
6、贪婪,惰性
贪婪 惰性
+ +?
? ??
* * ?
{n} {n}?
{n,} {n,}?
{n,m} {n,m}?
7、分组之后使用exec返回字符串数组
let pattern = /([a-z]+)\s([0-9]{4})/; let str = 'google 2018'; let arr = pattern.exec(str); //返回一个数组,length为3 console.log(arr[0]); //返回第一个字符串为,匹配的整个字符串 console.log(arr[1]); //返回第一个分组为,匹配的第一个分组匹配的字符串 console.log(arr[2]); //返回第二个分组为,匹配的第二个分组匹配的字符串
捕获性分组
let pattern = /(\d+)([a-z])/; //这个叫做捕获性分组,所有的分组都捕获 let str = '123str'; let arr = pattern.exec(str); arr[0]; //返回123str arr[1]; //返回123 arr[2]; //返回str
非捕获性分组(在不需要捕获的分组左括号后,添加 ?: )
let pattern = /(\d+)(?:[a-z]{3})/; let str = '123abc'; let arr = pattern.exec(str); //length为2 arr[0]; arr[1];
总结:就是匹配到的分组,如果是自己需要的话,就将其返回(捕获),不需要的分组就可以不返回(不捕获|非捕获),都是根据自己的需求来写。
8、嵌套分组(分组的延伸)
let pattern = /(a(b(c)))/; let str = 'abc'; let arr = pattern.exec(str); //["abc", "abc", "bc", "c", index: 0, input: "abc"]; index,input是实例属性 arr.length; //4 arr[0]; //abc arr[1]; //abc arr[2]; //bc arr[3]; //c
9、前瞻性捕获
let pattern = /goo(?=gle)/; //goo后面必须是gle才能返回goo,这里注意,返回的是goo,而不是google let str = 'google'; alert(pattern.exec(str)); //返回的是goo,而不是google,这是前瞻性捕获
10、匹配正则里面的特殊字符,使用反斜杠
let pattern = /\[/; //假如要匹配左中括号 [ ,要使用反斜杠转义 let str = '[nihao]'; pattern.test(str); //true
分类不是很对,将就看着吧。