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

基础

常用字符总结:

^ 匹配行的开始位置
$ 匹配行的结束位置
\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.$1 RegExp.$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后面的位置
(?<!experssion)匹配前面不是字符串experssion的位置
(?>experssion)只匹配字符串experssion一次

接下来根据几个例子来说下零宽断言:
(?=experssion):
(“102.103.104.111”).match(/(\d{1,3}.){3}111/g);//借助111来匹配字符串
result: [“102.103.104.111”]
但是如果我们不想要后面的111呢
若使用(?=experssion),结果中不会出现111
(“102.103.104.111”).match(/(\d{1,3}.){3}(?=111)/g);
result:[“102.103.104.”]

(?!experssion)与(?=experssion)相反,用来匹配后面不是experssion的结果
(“102.103.104.111”).match(/(\d{1,3}.){3}(?!112)/g);
result: [“102.103.104.”]
(“102.103.104.111”).match(/(\d{1,3}.){3}(?!111)/g);
result:null

(?<=experssion)以及(?<!experssion)和(?!experssion)、(?=experssion)对应,用来匹配前面。但是js不支持,如果在正则表达式中写?<=、?<!,js会报错,这时候我们可以使用上面的分组来解决此问题。

练习

练习提取一下一个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=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值