JavaScript正则表达式(基础、分组、懒惰匹配、反向引用和零宽断言)

时间:2022-05-05 06:20:03

基础

常用字符总结:

^ 匹配行的开始位置
$ 匹配行的结束位置
\b 匹配单词的开始或结束位置
. 匹配除换行符之外的任意字符
\w 匹配单词字符(包括字母、数字、下划线和汉字)
\W 匹配非单词字符
\s 匹配任意的空白字符(空格、制表符、换行符、中文全角空格)
\S 匹配任意的非空白字符
\d 匹配任意的数字
\D 匹配任意的非数字字符

基本的匹配

基本的匹配:
一些基本的匹配由 []与一些字符表示

[]:用来定义匹配的字符范围
例如[ab]c可以匹配出ac,bc
[1234567890]可以匹配出1个个位数
使用链接符可以来定义字符的范围
[0-9] [a-z] [A-Z]分别代表数字、小写字母、大写字母

^:若^是字符里的第一个字符,可以匹配除了^后面字符的其它字符
例如:对于ab ac abc adc a[^b]可匹配出ac、ad
[^0-9A-Za-z_]相当于\W

: 用来做转义
例如.匹配的是除换行度之外的任意字符
所以要匹配真正的. 需要. 。
匹配数字的正则表达式:/^-?[0-9]+(.[0-9]+)?$/,若我们要匹配出数字中的小数点,则必须使用\来做转义。

限定符:
{n}重复n次
{n,}重复至少n次
{n,m}重复至少n次,最多m次
* 重复至少n次
+ 重复至少1次
? 重复0次或1次

进阶

懒惰匹配

*? 尽可能少地使用重复第一次匹配
+? 尽可能少地使用重复,但至少使用一次
?? 使用零次重复(如有可能)或一次重复
{n}? 等同于{n}
{n,}? 尽可能少使用重复单至少使用n次
{n,m}?介于n次和m次之间,尽可能少使用重复

在基础里面,用到了一些基础的限定符,例如*、+,但有时候这些限定符不能满足我们的要求,觉得单纯使用*、+匹配的内容有点多,也就是所谓的贪婪匹配。

以一个例子来做贪婪匹配和懒惰匹配的对比:
var string = “aaabab”;

(string).match(/a.*b/g);(为贪婪匹配)
result:[“aaabab”] 对于正则表达式中的b,它匹配的是最后一个b

(string).match(/a.*?b/g);(为懒惰匹配)
result:[“aaab”,”ab”];

(string).match(/a.+b/g); (为贪婪匹配)
result:[“aaabab”]; 对于正则表达式中的b,它匹配的是最后一个b

(string).match(/a.+?b/g); (为懒惰匹配)
result:[“aaab”] 因为至少使用一次匹配,所有ab不会被匹配出来

(string).match(/a.??b/g)(为懒惰匹配)
result:[“aab”,”ab”];

(string).match(/a.?b/)(为贪婪匹配)
result:[“aab”,”ab”];

分组

分组又称子表达式,即把一个正则表达式的全部或部分分成一个组
(“102.103.104.111”).match(/(\d{1,3}.){3}\d{1,3}/);
result:[“102.103.104.111”,”104.”];
“104.”就是分组()中所匹配的,还可以通过RegExp.$1获得

(“102.103.104.111”).match(/(\d{1,3}.){1}(\d{1,3}.){1}(\d{1,3}.){1}\d{1,3}/);
result:[“102.103.104.111”,”102.”,”103.”,”104.”];
102. 103. 104.分别可以通过RegExp. 1RegExp. 2 RegExp.$3获得

分组的一个很大的作用可以从结果中截取出我们真正想要的字段。
文章最后截取html img标签中的src属性的例子中,我们将用到。

反向引用

有了分组的概念后,可以使用反向引用
可以在正则表达式中引用\1 \2 \3… 来代替前一个分组
(“102.102.104.111”).match(/(\d{1,3}.){1}\1(\d{1,3}.){1}\d{1,3}/g);
result:[“102.102.104.111”]
\1代表的是”102.”,并不指的是表达式的内容
(“102.103.104.111”).match(/(\d{1,3}.){1}\1(\d{1,3}.){1}\d{1,3}/g);
result:null
\1是匹配不出103.的

零宽断言

有时候,我们需要靠某些字符串来辅助我们来匹配到我们想要的字符串,但是却不想让它出现在我们的匹配结果中。

看零宽度之前,先看几个常用的分组说明
(?:experssion)匹配字符串experssion,不保存匹配的文本,也不给此组分配组号
(?=experssion)匹配字符串experssion前面的位置
(?!experssion)匹配后面不是字符串experssion的位置
(?<=experssion)匹配字符串experssion后面的位置
(?

练习

练习提取一下一个html中img标签中的src属性
提取的格式应该为
src=””
src=””
src=””
正则表达ss式为:
var Reg = /<img[^>](src=.*?)[\s|^>]+.*?[>]{1}/g
首先我们用img[^>]和[>]来匹配img标签。
这里用到了两次懒惰匹配,这里两次用到了懒惰匹配,src=.*? src遇见空格,src的匹配就结束了,而贪婪匹配会匹配到后面的空格,当然,我们也可以把src=.*?替换为src=[^\s]*来满足我们的需求。
因为我们只需要src=”“,所以靠分组来拿到我们需要的src=”“

var Reg = /<img[^>](src=.*?)[\s|^>]+.*?[>]{1}/g
var html = document.getElementsByTagName("body")[0].innerHTML;
var result = “”;
while((result = Reg.exec(html)) != null){console.log(result[1])};

result数组里有两个成员,第一个是通过正则表达式匹配出的结果,包括<img>的,也就是无视分组的,而第二个是分组的内容,括号内正则匹配出的内容,也就是我们需要的src=