正则入门

就是按照教程学一下基本概念, 自己的理解很少 ,
看这架势正则一篇文章不够 还得再弄点儿文章学习学习稍微高级一点儿的…

1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 博文作者:ruantao1989@gmail.com
* 出自博客:ruantao.duapp.com/blog
*/
//一: 创建正则对象
var regObj = /regExption/;
var regObj1 = new RegExp("regExption");
//二: 执行函数
//1.exec 成功返回数组, 失败返回null
var result = regObj.exec("someTestStr");
//如有结果, 则结果中带有一些信息
if( result ){
console.log("检测字串==>" + result.input + "_匹配位置==>" +result.index );
for (i = 0; i < result.length; i++) {
console.log('result[' + i + ']:' + result[i]);
}
}
//2.test 仅返回true false
regObj.test("someTestStr");
//3.match, match是字串的正则方法 ,返回字串:结果1,结果2....
"someTestStr".match(regObj);
//三: 量词
//连续个数 {n}表示匹配多个连续内容
/c{n}/则会匹配n个连续的字母"c"
/c{3,4}/的意思是,连续的3个c或者4个字母"c"
/c{1,}/表示1个以上的c,最多则不限个数。
//预定义字符
//*表示0次或者多次,等同于{0,}, 即c*和c{0,}等效
//+表示一次或者多次,等同于{1,}
//?表示0次或者1次,等同于{0,1}

2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//四:贪婪模式
/c{2,4}/.exec('ccccTest')//["cccc"] ==>而不是3个c, 原因是默认会匹配尽量多的内容
//非贪婪模式
//正则末尾加?,可会匹配尽量少的内容
/c{2,4}?/.exec('ccccTest')//["cc"]
//五. 元字符
//"^"开头,"$"结尾
//^c 表示以c开头 , c$ 表示以c结尾
//"."除了换行符\n之外的所有字符
/./.exec("ruantao.duapp.com");//["r"] 匹配==>第一个字母就是"非\n"的字符
/.d/.exec("ruantao.duapp.com");//[".d"] 匹配==>任意"非\n"后边紧跟字母d, d之前的"."也可以被匹配
/.+/.exec("ruantao.duapp.com");//["ruantao.duapp.com"] 匹配==>因为要匹配:任意多个"非\n"
//或
// "|" 表示左右两边任意一个,都可以匹配
/^k|r.+/.exec("ruantao.duapp.com");//["ruantao.duapp.com"] 匹配==>1.k的,2.或是r开头任意个"非\n"的
/^k|r.+/.exec("kruantao.duapp.com");//["k"]
//括号
//括号里是子正则,
//exec后, 子正则所匹配的内容会出现在结果数组[0]之后,从[1]按个数顺延
/^(k|r).+/.exec("kruantao.duapp.com");//["kruantao.duapp.com","k"] 匹配==>k或r开头,后边任意个"非\n"字符. 数组[1]是由于子正则产生的
//集合
//中括号[]中的表达式, 作为一个整体
//[xyzr]表示x或y或z或r中的任意一个字符
/^[xyzr]/.exec("ruantao.duapp.com");//["r"] ==>4个字母任意一个开头的
/^[xyzr].+/.exec("ruantao.duapp.com");//["ruantao.duapp.com"] ==>4个字母任意一个开头,后边任意个"非\n"的
//集合中取反
//[^xyzr]表示非x或y或z或r中的任意一个字符
/[^xyzr]/.exec("ruantao.duapp.com");//["u"] ==>非这4个字母的
/[rtcom]{2}/.exec("ruantao.duapp.com");//["co"] ==>匹配[rtcom]任意连续的两个,就是co了
//范围
/[1-9]/.exec("ruantao");//null ==>没有数字
//边界
//\b表示的边界 \B是非边界
//表达式/\bc/就是以c开头或结尾的
//数字
//\d表示数字的意思,相反,\D表示非数字
/\d/.exec("ruantao.duapp.com123");//["1"]
//空白符
//\f匹配换页符,\n匹配换行符,\r匹配回车,\t匹配制表符,\v匹配垂直制表符。
//\s匹配单个空格,等同于[\f\n\r\t\v]
//\S表示非空格字符。
/\S+/.exec("ruantao com");//["ruantao"] ==>第一个空格时候停止了
//\w表示单词字符,等同于字符集合[a-zA-Z0-9_]
/\w+/.exec("ruantao.duapp.com");//["ruantao"] ==>"."是非单词字,到"."就结束了
//\W表示非单词字符,等效于[^a-zA-Z0-9_]
//反向引用
//最后的"\编号"代表之前,对应子正则的内容
/(\w)\1/.exec("ruantao,rr");//["rr", "r"] ==>(\w)对应"r", 之后\1引用"r",所以就是要找"rr".
//结果["rr", "r"] 中 "rr"是全部正则匹配出来的内容, "r"是子正则(\w)匹配的内容
/(\w)(\w)\2\1/.exec("ruantao,ruur");//["ruur", "r", "u"] ==>头俩(\w)匹配ru,\2\1匹配ur, 加一块儿就是ruur
//结果["ruur", "r", "u"]中,依次是全正则的内容, 第一个(\w)内容 , 第二个(\w)内容
//正向预查
//(?=pattern), 比如只需要ruantao1中的字符, 不需要ruantao2中的字符
/ruantao(?=com)/.exec("ruantaonet");//null ==>因为后边不是紧跟着1
//正向预查的反操作?!,
/ruantao(?!=com)/.exec("ruantaonet");//["ruantao"]

3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//六.分组查询
//中括号表示范围内选择,大括号表示重复次数。小括号允许我们重复多个字符
//分组+量词
/(rt){2}/.exec("rtrt");//["rtrt", "rt"]
//分组+范围
/([bd]ad)*/.exec("baddad");//["baddad", "dad"] ==>bad后边得有东西,所以是"baddad",
//分组+分组
/(mon( and dad)?)/.exec(/mon and dad/);//["mon and dad", "mon and dad", " and dad"]
//七.修饰符
// /i忽略大小写 , /m忽略"\n"的影响 ,/g继续查找
var str = "ruantao",
reg = /\w/g;
console.log(reg.exec(str));//["r", index: 0, input: "ruantao"]
console.log(reg.lastIndex);//1
console.log(reg.exec(str));//["u", index: 1, input: "ruantao"]
console.log(reg.lastIndex);//2
console.log(reg.exec(str));//["a", index: 2, input: "ruantao"]
console.log(reg.lastIndex);//3
console.log(reg.exec(str));//["n", index: 3, input: "ruantao"]
console.log(reg.lastIndex);//4