0%

正则表达式

1
2
3
4
5
6
/*
* 正则表达式
* - 用于定义一些字符串的规则,
* 计算机可以根据正则表达式,来检查一个字符串是否符合规则,
* 获取将字符串中符合规则的内容提取出来
*/

创建正则表达式的两种方法

1.构造函数法

1
2
var reg = new RegExp("正则表达式","匹配模式");
var reg1 = new RegExp("a"); //检查一个字符串中是否含有a

2.字面量法

1
var reg = /正则表达式/匹配模式;

正则表达式的方法

test()

1
2
3
4
5
6
/**
* 正则表达式的方法:
* test()
* 使用这个方法可以用来检查一个字符串是否符合正则表达式的规则
* 如果符合规则则会返回true,否则返回false
*/

exec()

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。

可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

1
2
3
4
5
6
7
8
9
var str = "Visit W3School"; 
var patt = new RegExp("W3School","g");
var result;

while ((result = patt.exec(str)) != null) {
document.write(result);
document.write("<br />");
document.write(patt.lastIndex);
}

创建一个正则表达式检查一个字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*

* []中的内容也是或的关系

* [ab] == a|b

* [a-z] 任意小写

* [A-Z] 任意大写

* [A-z] 任意字母

* () 匹配,返回的是字符串,与exec()使用

*/
//检查一个字符串中是否含有abc或者adc或者aec
reg = /abc|adc|aec/;
reg = /a[bde]c/;

/**
* [^ ] 除了
*/
reg = /[^ab]/;
reg = /[^0-9]/; //除了数字

下面正则表达式中,哪项不匹配( )

  • 1
    2
    var reg=/ph+..p/;
    var str="phabp";
  • 1
    2
    var reg=/ph+..p/;
    var str="phhhhp";
  • 1
    2
    var reg=/ph+..p/;
    var str="phhhaap";
  • 1
    2
    var reg=/ph+..p/;
    var str="phhhaaap";

    正确选项D

1
2
3
.表示任意字符
如果检查字符串中是否含有.需要用转义符\即\.
注意:使用构造函数时,由于它的参数是一个字符串,而\是字符串中的转义字符,需要使用\\来代替
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* \w
* - 字母、数字、下划线[0-9a-z]
* \W
* - 除了字母、数字、下划线
* \d
* - 任意数字[0-9]
* \D
* - 除了数字[^0-0]
* \s
* - 空格
* \S
* - 除了空格
* \b
* - 单词边界
* \B
* - 除了单词边界
*/

量词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 量词
* - 通过量词可以设置一个内容出现的次数
* - 量词只对它前边的一个内容起作用
*
* - {n} 正好出现n次
* - {m,n} 正好出现m-n次
* - {m,} 正好出现m次以上
* - n+ 正好出现1次或者多次,相当于{1,}
* - n* 正好出现0次或者多次,相当于{0,}
* - n? 0个或1个,相当于{0,1}
*/
/**
* 检查一个字符串是否以a开头
* ^ 表示开头
* $ 表示结尾
*/

例如

1
2
.* 贪婪匹配
.*? 懒惰模式,是满足条件的情况只匹配一次,即最小匹配.

邮件的正则表达式

1
2
3
4
5
6
7
8
9
10
11
/**
*电子邮箱
*abc.hello@abc.com.cn
*
*任意的字母数字下划线 . 任意的字母数字下划线 @ 字母或数字 . 字母 .字母(不是必要的)
* /w{3,} /. (/w{3,})* @ [A-z0-9]+ /. ([A-z]{2-5})+
*
*/
var emailReg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;
var email = "abc.hello@163.com";
console.log(emailReg.test(email));

爬虫中的正则

使用exec()方法

(.*?) 表示匹配的内容,exec返回的数字下标0为匹配的内容,1表示匹配的 第一个(.*?)内容,一次往后推

1
2
3
4
5
6
7
8
9
10
11
12
13
let str = `<p class="search-index-R"><a href="https://www.1905.com/vod/list/n_1/o3p1.html" class="cur">电影</a><a href="https://www.1905.com/vod/list/n_1_t_1_c_922/o3p1.html" >微电影</a><a href="https://www.1905.com/vod/list/n_2/o3p1.html" >系列电影</a><a href="https://www.1905.com/vod/list/n_1_t_1_c_927/o3p1.html" >纪录片</a><a href="https://www.1905.com/vod/list/n_1_t_1_c_586/o3p1.html" >晚会</a><a href="https://www.1905.com/vod/list/n_1_t_1_c_178/o3p1.html" >独家</a><a href="https://www.1905.com/vod/list/n_1_t_1_c_1024/o3p1.html" >综艺</a><a href="https://www.1905.com/vod/list/n_1_t_1_c_1053/o3p1.html" >体育</a></p>`

let reg = /<a href="(.*?)".*?>(.*?)<\/a>/igs //s表示匹配换行符
let arrClass = []
while( res = reg.exec(result) ){
let obj = {
all: res[0],
className: res[2],
url:res[1]
}
arrClass.push(obj)
}
console.log(arrClass)