创建正则表达式
js是通过RegExp类型来支持正则表达式的,主要有2种方式来创建正则表达式:
- 以字面量的形式来定义
- 使用RegExp构造函数。
这次做的笔记主要是写字面量来表示,RegExp构造函数以后再补充。一般情况下字面量用的比较多,但是当正则需要传参数的时候,必须要用RegExp的写法(比如说在一个函数中,正则是一个传进来的参数)
字面量表示
形如:
var express = /pattern/flags;
其中pattern是正则表达式
flags:g表示全局模式,即模式被应用于所有字符串;i表示不区分大小写;m表示多行模式。
元字符
特别注意:模式中使用的所有的元字符都必须转义。用\转义。
元字符有:( { [ \ ^ $ | ? * + . ] } )
例如:
var str = /\[ab\]c/ //匹配第一个"[ab]c"
捕获组/匹配子项
匹配子项:小括号()(小括号还有另外一个意思,分组操作)
可以把正则的整体叫做母亲,然后把左边第一个小括号里面的正则,叫做这个母亲的第一个子项(捕获组)。第二个就是第二个子项(捕获组)。。。。。。
例如:
var re = /(\d+)(-)/g;
在这里”\d+”就是第一个捕获组,“-”是第2个捕获组
重点区分{}的含义,以及一些特定的符号
1.{} 量词
{}在正则里面表示的是量词
- {n,m}表示前面的字符最少出现n次,最多出现m次。
- {n,}至少出现n次
- {n}真好出现n次
- + :其实是{1,}的简写
- ? : {0,1},至多1次
- * : {0,},至少0次
2.() 匹配子项,或者是分组操作
- 把正则的整体叫做(母亲),然后把左边第一个小括号里面的正则,叫做这个母亲的第一个子项(孩子)。第二个就是第二个子项。。。。。。
3.[] 字符类
- []在正则里面表示的是字符类,也就是一组类似的元素,[]中括号里面的整体代表一个字符。
4.特定的一些符号
- \s : 一个空格(包括Tab等空白符)
- \S : 非空格
- \d : 一个数字
- \D : 非数字
- \w : 一个字符 (字母,数字,下划线_)
- \W : 非字符
- \b :独立的部分,(起始,结束,空格),也就是匹配单词边界,注意在单词边界匹配的位置,单词字符后面或前面不与另一个单词字符直接相邻。请注意,匹配的单词边界并不包含在匹配中。换句话说,匹配的单词边界的长度为零。(不要与 [\b] 混淆。)
- \B : 非独立部分,也就是非单词边界。匹配位置的上一个和下一个字符的类型是相同的:即必须同时是单词,或必须同时是非单词字符。字符串的开头和结尾处被视为非单词字符。
例如:
var str = 'one two'
var re2 = /one\b/;
alert(re2.test(str));
/one\b/表示one后面不与另一个单词字符直接相邻
- . : 匹配任意字符
-
- : 表示一个区域范围(从小到大)
- ^ : 如果在正则的最开始位置,代表起始的意思,如果是在[]表示排除
- $ : 如果在正则的最后位置,代表结束的意思
- | : 表示或者
- \数字 : 表示重复子项:\1 重复的第一个子项;\2 重复的第二个子项.
例如:
var str = 'onesssgsdoso'
var re2 = /(o)(s)\1/;
alert(re2.test(str));
/(o)(s)\1/ 这里\1就是表示o
var str = '123231a443'
var re2 = /([0-9])(a)\1/;
alert(re2.test(str));
//结果是false
var str = '123231a143'
var re2 = /([0-9])(a)\1/;
alert(re2.test(str));
//结果是true
所以注意:子项是指匹配到的字符串。
方法
match()
match:正则去匹配字符串,如果匹配成功,就返回匹配成功的数组;如果不成功,返回null;
用法:字符串.match(正则)
例如:
var str = '12ss123s1d23632x';
var re = /\d\d+/g;//全局模式g:全部查找
alert(str.match(re));
结果是[12,123,23632]
注意:match()也可以用来匹配子项,匹配的子项放在返回数组的后几项,不过这个前提是不加g,加了g就不会返回子项了。
例如:
var str = 'sdfsdfsdfsddfs sd';
var re = /(s)(d)/;
alert(str.match(re));
结果是[sd,s,d]
但如果加了g
var str = 'sdfsdfsdfsddfs sd';
var re = /(s)(d)/g;
alert(str.match(re));
结果就是[sd,sd,sd,sd,sd]
test()
test:正则去匹配字符串,如果匹配成功,返回真,否则返回假;
用法:正则.test(字符串)
search()
serch:正则去匹配字符串,如果成功,返回字符串中第一个匹配项的索引;如果没找到,则返回-1
用法:字符串.search(正则)。
注意这里只返回第一个匹配项,不管有没有g都是这样。
replace()
replace:正则去匹配字符串,匹配成功的字符去替换成新的字符串;
用法:字符串.replace(正则,字符串);
注意它的第二个参数可以是字符串,也可以是个回调函数:
回调函数
注意函数的参数(注意顺序):模式的匹配项,(第一个捕获组的匹配项,第2个捕获组的匹配,…),模式匹配项在字符串中的位置,原始的字符串。
这个回调函数应该返回一个字符串,表示被替换的匹配项。
例如:
var str = '2016-7-14';
var re1 = /(\d+)(-)/g;
str = str.replace(re1,function($0,$1,$2){
//第一个参数是母亲,第2个参数是第2个孩子、、、、
alert($1);
return $1 + '.'
});
这段代码中,$0就是2016-,7- ,而对应的$1是,2016,7,对应的$2是-,-