正则表达式


元字符

([{+*?.$^|

字符类

简单类

原则上正则的一个字符对应一个字符,我们可以用[]把它们括起来,让[ ]这个整体对应一个字符

1
2
3
/caicai/.test("caicai") //true
/[ca]i/.test("caicai") //true
"caicai".match(/[ca]i/) // ["ai"] 因此说明匹配不了cai整个字符,只能匹配[]中的一个字符和外边的i想对应

预定义类

还是在那个中括号里面做文章,不过它好像已经走到尽头了。由于是中括号的马甲,因此它们还是对应一个字符。

字符等同于描述
.[^\n\r]一个除了换行和回车外的所有字符
\d[0-9]一个数字字符
\D[^0-9]一个非数字字符
\w[a-zA-Z0-9_]一个单词字符(所有的字母)
\W[^a-zA-Z0-9_]一个非单词字符
\s[\t\n\x0B\f\r]一个空白字符
\S[^\t\n\x0B\f\r]一个非空白字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
alert(/\d/.test("3"))//true
alert(/\d/.test("w"))//false
alert(/\D/.test("w"))//true
alert(/\w/.test("w"))//true
alert(/\w/.test("菜"))//false
alert(/\W/.test("菜"))//true
alert(/\s/.test(" "))//true
alert(/\S/.test(" "))//false
alert(/\S/.test("菜菜"))//true
alert(/./.test("菜"))//true
alert(/./.test(" "))//true
var a = "\n\
"
alert(/./.test(a))//true
/[\u4e00-\u9fa5]/用于匹配单个汉字。
/[\u4e00-\u9fa5]{4}/.test("菜菜菜鸟") //true

量词

代码类型描述
?软性量词出现零次或一次
*软性量词出现零次或多次(任意次)
+软性量词出现一次或多次(至少一次)
{n}硬性量词对应零次或者n次
{n,m}软性量词至少出现n次但不超过m次
{n,}软性量词至少出现n次(+的升级版)

分组

到目前为止,我们只能一个字符到匹配,虽然量词的出现,能帮助我们处理一排密紧密相连的同类型字符。但这是不够的,下面该轮到小括号出场了,中括号表示范围内选择[],大括号表示重复次数{}。小括号允许我们重复多个字符()

1
2
3
4
5
/(cai){2}/.test("caicai") //true
/13(\d)(\d{8})/.test("13595687859") //true
//RegExp.$n n为匹配最近的n个正则表达式的匹配结果,以上面电话号码为例:$1=(\d) $2=(\d{8})
console.log(RegExp.$1) //会匹配到上面的第一个正则 此例为5 
console.log(RegExp.$2) //会匹配到上面的第二个正则 此例为95687859

继续在分组上做文章。在分组中插入管道符(“|”),把它划分为两个或多个候多项。

1
2
3
4
5
6
7
8
var reg = /(red|black|yellow)!!/;
console.log(reg.test("red!!"))//true
console.log(reg.test("black!!"))//true
console.log(reg.test("yellow!!"))//true
//将<>括号和里面的都替换为空
var html = "<p><a href='http://www.cnblogs.com/rubylouvre/'>caicai</a>by <em>asas</em></p>";
var text = html.replace(/<(.)*?>/g, "");
console.log(text) //caicai asas