计算机教程

当前位置:3522.com > 计算机教程 > 详解javascript 正则表达式之分组与前瞻匹配

详解javascript 正则表达式之分组与前瞻匹配

来源:http://www.4sports-uk.com 作者:3522.com 时间:2019-07-28 10:24

本文主要讲解javascript 的正则表达式中的分组匹配与前瞻匹配的,需要对正则的有基本认识,本人一直对两种匹配模棱不清。所以在这里总结一下,如有不对,还望大神指点。

本文主要讲解javascript 的正则表达式中的分组匹配与前瞻匹配的,需要对正则的有基本认识,本人一直对两种匹配模棱不清。所以在这里总结一下,如有不对,还望大神指点。

1.分组匹配:

1.分组匹配:
  1.1捕获性分组匹配 ()
  2.2非捕获性分组匹配 (?:)
2前瞻匹配:
  2.1正向前瞻匹配: (?=表达式) 后面一定要匹配有什么
  2.2反向前瞻匹配: (?!表达式) 后面一定不能要有什么

  1.1捕获性分组匹配 ()
  2.2非捕获性分组匹配 (?:)

 

2前瞻匹配:

1.1、捕获性分组匹配 ()

  2.1正向前瞻匹配: (?=表达式) 后面一定要匹配有什么
  2.2反向前瞻匹配: (?!表达式) 后面一定不能要有什么

var str1 = "holle word 123456 can 12s a 123 a";
var reg1 =/([a-z] )s(d )/; //不是全局模式 ,以() 分组,这里有两组,每一组都将匹配得到
var regg1 = /([a-z] )s(d )/g; //全局模式 g,以() 分组,这里有两组,每一组都将匹配得到

//res :非全局模式
console.log(reg1.exec(str1)); //exec()方法:["wold 123456","word","123456"]
console.log(str1.match(reg1));//match()方法:["word 123456","word","123456"]
console.log(RegExp.$1);//获取到第一个分组  ([a-z] ) 匹配的结果  :word
console.log(RegExp.$2);//获取到第一个分组  (d ) 匹配的结果  :123456

//res :全局模式
console.log(regg1.exec(str1)); //exec()方法:["wold 123456","word","123456"]
console.log(str1.match(regg1));//match()方法:["word 123456","can 12","a 123"]
console.log(RegExp.$1);//获取到第一个分组  ([a-z] ) 匹配的结果  :a
console.log(RegExp.$2);//获取到第一个分组  (d ) 匹配的结果  :123

1.1、捕获性分组匹配 ()

分析:这个正则表达式匹配的是,至少一个字母,跟着一个空格,然后至少一个数字,

var str1 = "holle word 123456 can 12s a 123 a";
var reg1 =/([a-z] )s(d )/; //不是全局模式 ,以() 分组,这里有两组,每一组都将匹配得到
var regg1 = /([a-z] )s(d )/g; //全局模式 g,以() 分组,这里有两组,每一组都将匹配得到
//res :非全局模式
console.log(reg1.exec(str1)); //exec()方法:["wold 123456","word","123456"]
console.log(str1.match(reg1));//match()方法:["word 123456","word","123456"]
console.log(RegExp.$1);//获取到第一个分组 ([a-z] ) 匹配的结果 :word
console.log(RegExp.$2);//获取到第一个分组 (d ) 匹配的结果 :123456
//res :全局模式
console.log(regg1.exec(str1)); //exec()方法:["wold 123456","word","123456"]
console.log(str1.match(regg1));//match()方法:["word 123456","can 12","a 123"]
console.log(RegExp.$1);//获取到第一个分组 ([a-z] ) 匹配的结果 :a
console.log(RegExp.$2);//获取到第一个分组 (d ) 匹配的结果 :123

非全局就是第一次匹配正确就不会再往后匹配 了,

分析:这个正则表达式匹配的是,至少一个字母,跟着一个空格,然后至少一个数字,

1.exec()方法提取的值是规定的,第一个值是正则表达式相匹配的文本,如上示例的"/([a-z] )s(d )/",第2个值是第一个字子表达式(即第一个分组),如上示例的"([a-z])",以此类推

非全局就是第一次匹配正确就不会再往后匹配 了,

2.即使是全局模式,exec()都不会全局匹配,循环调用exec()是唯一全局匹配的方式,所以你会发现上面使用exec()方法的结果是一样

1.exec()方法提取的值是规定的,第一个值是正则表达式相匹配的文本,如上示例的"/([a-z] )s(d )/",第2个值是第一个字子表达式(即第一个分组),如上示例的"([a-z])",以此类推

3.而 match 方法在全局模式的捕获性分组匹配,会对正则表达式全局匹配,但是不会对子表达式匹配(分组),所以你会发现上面str1.match(regg1) 的结果是不会单独以分组([a-z] )字母或者分组(d )数字出现,而是全局匹配整一个正则,所以结果是["word 123456","can 12","a 123"]

2.即使是全局模式,exec()都不会全局匹配,循环调用exec()是唯一全局匹配的方式,所以你会发现上面使用exec()方法的结果是一样

4.match 方法在非全局模式 的捕获性分组匹配中,会对正则表达式全局匹配,也会对子表达式匹配(分组),所以你发现,str1.match(reg1)匹配的结果有单独分组的匹配,但是因为是非全局,所以第一次匹配正确就结束了,只有["wold 123456","word","123456"],“wold 123456” 是整个表达式匹配的结果,“word” 是第一个分组([a-z] )匹配的结果,“123456” 是第二分组(d ) 匹配的结果

3.而 match 方法在全局模式的捕获性分组匹配,会对正则表达式全局匹配,但是不会对子表达式匹配(分组),所以你会发现上面str1.match(regg1) 的结果是不会单独以分组([a-z] )字母或者分组(d )数字出现,而是全局匹配整一个正则,所以结果是["word 123456","can 12","a 123"]

5.$1,$2... 分别包含正则表达式中的相对应反向引用,在全局与非全局模式,如果结果集有多个,会以最后一次匹配的结果来算,如上面,全局模式,匹配一共有三个符合的,["word 123456","can 12","a 123"],那么就以最后一个"a 123"为所有分组得到的结果,第一个分组是([a-z] ) 匹配的是字母所以是a,第二个分组是数字(d ),所以是123 ,以此类推,如果只出现一次,一次也是当最后一次,自然也是一样的分析,哈哈哈,有点多余。。。。

4.match 方法在非全局模式 的捕获性分组匹配中,会对正则表达式全局匹配,也会对子表达式匹配(分组),所以你发现,str1.match(reg1)匹配的结果有单独分组的匹配,但是因为是非全局,所以第一次匹配正确就结束了,只有["wold 123456","word","123456"],“wold 123456” 是整个表达式匹配的结果,“word” 是第一个分组([a-z] )匹配的结果,“123456” 是第二分组(d ) 匹配的结果

 

本文由3522.com发布于计算机教程,转载请注明出处:详解javascript 正则表达式之分组与前瞻匹配

关键词: 3522.com

上一篇:mysql5.7安装教程(windows)

下一篇:没有了