正则表达式

基本用法

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
// 说明: 正则在不同语言的支持方法语法略有不同  js、java、php ...
var str = "Hello Java Hello java";
// 1:在js中如果要引入正则表达式,则需要:/.../
// 2:stirng.match(/表达式/) 匹配成功返回数组,否则为null
// 3:普通匹配符: 能够匹配以之对应的字符
// 4:默认正则区分大小写
// 5: i、g、m 称为正则标记符(参数): i:不区分大小写 g:全局匹配 m: 多行匹配
var r=str.match(/java/gi);

// 6:能够匹配多个字符中的其中一个匹配符: \d: 0~9 \w: 字母、数字、下划线 .:匹配除换行的所有字符(\d \w . 都只能匹配一个)
str = "hello 2016";
r=str.match(/\w.\d/g);

// 7:能够自定义规则的匹配符[],如果在[^]代表取反
str = "198" // 第二数值 3|5|8|9
r=str.match(/1[3589]\d/);

// 8:用来修饰匹配次数的匹配符 {n}: 代表前面匹配符出现n次
/*
{n,m}: 出现次数 n~m之间 {n,}: n~max {,n}: min~n
+: 1~max ?: 0~1 *: 0~max
*/
str = "18312345678";
r=str.match(/1[3589]\d{9}/);

// 9:正则表达式的完整匹配 ^: []中^代表取反,但是在外面代表的是从开始匹配 $:持续匹配的结束
// 10:特殊符号如何匹配,在正则中:^ $ . \ [] 这些符号在匹配的时候需要加\
str = "15312345678";
r=str.match(/^1[3589]\d{9}$/);
str = "153^.$[]";
r=str.match(/\^\.\$\[\]$/);

// 11: 条件分支 | 2:(): 1: 括号中的内容,成为一个独立的整体! 2: 括号的内容可以进行分组,单独匹配,不需要此功能则(?:)
// 在添加^$ 完整匹配模式下如果完整匹配成功后面才会有分组匹配的功能.
str = "12&3.jpeg";
r=str.match(/\.(?:png|gif|jpe?g)$/);

// 12: 数值的匹配 1:把合法的数值写出并分析规律 2:根据规律编写正则,并且测试非法数值
str = "-12.34E5";
r = str.match(/^(-?)(0|[1-9]\d*)(\.\d+)?([eE][-+]?\d+)?$/);


// 13: 中文的处理 默认中文采用的是双字节, 在计算机中通过ASCII对应表来输入汉字
// 来设置中文的范围即可 escape() 可以把字符串转化为ASCII编码 unescape() 可以把编码转化为中文
// console.info(escape('一') + "," + unescape(escape('一')) + "," + escape('龥'));
str = '欕eom旕eos瓰fenwa覅fiao猤fui甴gad嚿geo啹geu喼gib嗰go兝gongfen兣';
r=str.match(/[\u4E00-\u9FA5]/g);

// 14: 贪婪与懒惰: 在正则中默认是贪婪模式(尽可能多的匹配) 可以在修饰数量的匹配符(* + ? {})后面添加? 则代表懒惰
str = "aabab";
r=str.match(/a.*?b/g);
console.info(r);

正则匹配IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
IP地址的语法: 长度是32位,分成4段,每段8位(2进制),如果用十进制来表示则范围为0~255, 段与段之间.来表示

合法: 192.168.1.1 224.34.2.34 非法: 256.234.2.1 保留IP地址: 0.0.0.0 255.255.255.255

如果整体匹配有问题,则应该分开匹配: 拆分是根据经验.怎么方便怎么来
250~255: 25[0-5]
200~249: 2[0-4]\d
0~199:
0-9: \d =====> [1-9]?\d
10~99: [1-9]\d ====>[1-9]?\d
100~199 1\d{2}
*/
var reg=/^(?:(?:25[0-5]|2[0-4]\d|[1-9]?\d|1\d{2})\.){3}(?:25[0-5]|2[0-4]\d|[1-9]?\d|1\d{2})$/;
var ip="255.255.255.255";
console.info(ip.match(reg));

exec、test的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var email = "10000@qq.com,xyz@163.com,20000@qq.com";
// match:如果是全局匹配(g)那么是不支持分组的, 一般g与 ^ $ 是互斥
console.info(email.match(/(\d+)@qq.com/g));
// RegExp: exec 支持全局+分组功能, 默认情况每次只查找一个
var regExp=new RegExp(/(\d+)@qq.com/g);
//console.info(regExp.exec(email));
// 当匹配成功下一次继续执行索引值会存储到lastindex中
//console.info(regExp.lastIndex); // regExp.lastIndex=0
//console.info(regExp.exec(email));
//console.info(regExp.lastIndex);
while(temp=regExp.exec(email)){ // js中: null,0,false,undifend
console.info(temp[0] + "," + temp[1]);
}
// test: 一般用于表单验证.如果匹配成功返回true 否则返回false
var regExp=new RegExp(/^1[3589]\d{9}$/);
console.info(regExp.test(12312345678));

过滤html标签

1
2
3
4
5
var txt=document.getElementById('txt').value;
console.info(txt);
// txt=txt.replace(/<\/?(style|script|i?frame)(.|\n)*?>/gi,'');
txt=txt.replace(/<(style|script|i?frame)(.|\n)*?>(.|\n)*?<\/(style|script|i?frame)(.|\n)*?>/gi,' ');
console.info(txt);

图片抓取

1
2
3
4
5
6
7
8
9
10
11
12
// 1: 在写表达式时,应该先把正确的格式罗列,通过正确的格式来编写表达式
// 2: 如果特殊的情况比较多.则考虑整体分为多个部分,部分解决
var img= "图片1:<img src='img.png' />....";
console.info(img.match(/<img\ssrc='.+'.+\/>/));
img = "图片2:<img alt='prompt' src=\"img.png\" class='cla' >....";
console.info(img.match(/<img.+src=["'].+["'].+[\/]?>/));
img = "图片3:<IMG alt='prompt' Src=img.png>....";
console.info(img.match(/<img.+src=["']?.+["']?.*[\/]?>/i));
// 在页面中通常会有多张图例如:
img = "图片1:<img src='img.png' />图片2:<img alt='prompt' src=\"img.png\" class='cla' >图片3:<IMG alt='prompt' Src=img.png>";
// 默认在匹配的过程中是贪婪模式. 在匹配多个对象时,一般来说修改成懒惰
console.info(img.match(/<img.+?src=["']?.+?["']?.*?[\/]?>/gi));

常用的正则替换

  1. 单引号通过正则替换转义成\'
1
.replace(/\'/g, `\\\'`)