javascript 正则表达式之分组与前瞻匹配详解
本文主要讲解javascript 的正则表达式中的分组匹配与前瞻匹配的,需要对正则的有基本认识,本人一直对两种匹配模棱不清。所以在这里总结一下,如有不对,还望大神指点。
1.分组匹配:
1.1捕获性分组匹配 ()
2.2非捕获性分组匹配 (?:)
2前瞻匹配:
2.1正向前瞻匹配: (?=表达式) 后面一定要匹配有什么
2.2反向前瞻匹配: (?!表达式) 后面一定不能要有什么
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.$);//获取到第一个分组 ([a-z]+) 匹配的结果 :word
- console.log(RegExp.$);//获取到第一个分组 (\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.$);//获取到第一个分组 ([a-z]+) 匹配的结果 :a
- console.log(RegExp.$);//获取到第一个分组 (\d+) 匹配的结果 :123
分析:这个正则表达式匹配的是,至少一个字母,跟着一个空格,然后至少一个数字,
非全局就是第一次匹配正确就不会再往后匹配 了,
1.exec()方法提取的值是规定的,第一个值是正则表达式相匹配的文本,如上示例的"/([a-z]+)\s(\d+)/",第2个值是第一个字子表达式(即第一个分组),如上示例的"([a-z])",以此类推
2.即使是全局模式,exec()都不会全局匹配,循环调用exec()是唯一全局匹配的方式,所以你会发现上面使用exec()方法的结果是一样
3.而 match 方法在全局模式的捕获性分组匹配,会对正则表达式全局匹配,但是不会对子表达式匹配(分组),所以你会发现上面str1.match(regg1) 的结果是不会单独以分组([a-z]+)字母或者分组(\d+)数字出现,而是全局匹配整一个正则,所以结果是["word 123456","can 12","a 123"]
4.match 方法在非全局模式 的捕获性分组匹配中,会对正则表达式全局匹配,也会对子表达式匹配(分组),所以你发现,str1.match(reg1)匹配的结果有单独分组的匹配,但是因为是非全局,所以第一次匹配正确就结束了,只有["wold 123456","word","123456"],“wold 123456” 是整个表达式匹配的结果,“word” 是第一个分组([a-z]+)匹配的结果,“123456” 是第二分组(\d+) 匹配的结果
5.$1,$2... 分别包含正则表达式中的相对应反向引用,在全局与非全局模式,如果结果集有多个,会以最后一次匹配的结果来算,如上面,全局模式,匹配一共有三个符合的,["word 123456","can 12","a 123"],那么就以最后一个"a 123"为所有分组得到的结果,第一个分组是([a-z]+) 匹配的是字母所以是a,第二个分组是数字(\d+),所以是123 ,以此类推,如果只出现一次,一次也是当最后一次,自然也是一样的分析,哈哈哈,有点多余。。。。
1.2 (?:) 非捕获性分组匹配 ,不捕获子表达式(分组)
- var str1 = "holle word 123456 can 12s a 123 a";
- var reg2 = /(?:[a-z]+)\s(?:\d+)/;
- var regg2 = /(?:[a-z]+)\s(?:\d+)/g;
- //res :非全局模式
- console.log(reg2.exec(str1));// exec(): 直接匹配["wold 123456"],
- console.log(str1.match(reg2));//match()方法:["word 123456"]
- //res :全局模式
- console.log(regg2.exec(str1));// exec(): 直接匹配["wold 123456"],
- console.log(str1.match(regg2));//match()方法:["word 123456","can 12","a 123"]
分析,和上面的捕获性分组匹配是一样的解析,只是不再匹配子表达式(分组)
2.1正向前瞻匹配: (?=表达式) 后面一定要匹配有什么
注意:前瞻分组匹配(?=表达式) 会作为匹配内容,不会作为匹配结果返回
- //实例,提取以jpg类型的图片名称
- var str2 = "ab.jpg,admin/12.gif,and.jpg";
- var reg3 = /[^\\]\w+(?=\.jpg)/g;
- console.log(str2.match(reg3));//["ab", ",and"]
2.2反向前瞻匹配: (?!表达式) 后面一定不能要有什么
- //示例:匹配 连续a字母三个以上,且后面不能有数字
- var str3 = "aaa12345,aaaadmin,aaaaaadd,dlala";
- var reg4 = /a{,}(?!\d+)/g;
- console.log(str3.match(reg4));//["aaaa","aaaaaa"]
完结,谢谢。。。。
javascript 正则表达式之分组与前瞻匹配详解的更多相关文章
- javascript:function 函数声明和函数表达式 详解
函数声明(缩写为FD)是这样一种函数: 有一个特定的名称 在源码中的位置:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)中 在进入上下文阶段创建 影响 ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务
感谢一路走来默默支持和陪伴的你~~~ -------------------欢迎来访,拒绝转载-------------------- 一.Rest API基础 ArcGIS 平台提供了丰富的REST ...
- JavaScript正则表达式之分组匹配 / 反向引用
语法 元字符:(pattern) 作用:用于反复匹配的分组 属性$1~$9 如果它(们)存在,用于得到对应分组中匹配到的子串 \1或$1 用于匹配第一个分组中的内容 \2或$2 用于匹配第一个分组中的 ...
- JavaScript正则表达式模式匹配(1)——基本字符匹配
var pattern=/g..gle/; //点符号表示匹配除了换行符外的任意字符 var str='g78gle'; alert(pattern.test(str)); var pattern=/ ...
- js正则表达式 URL格式匹配详解
0.URL格式 protocol :// hostname[:port] / path / [;parameters][?query]#fragment [;parameters]没见过 这里就不做相 ...
- Javascript的调试利器:Firebug使用详解
转载自:http://blog.csdn.net/tianxiaode/archive/2007/09/02/1769152.aspx 一直在用firebug,可是没有这么精通,今天看到本文章觉得 ...
- JavaScript 继承 封装 多态实现及原理详解
面向对象的三大特性 封装 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. ...
- Linux正则表达式扩展部分第一波深度实践详解
扩展的正则表达式(Extended Regular Expressions): 使用的命令:grep -E 以及 egrep [了解即可] 1)+ 表示重复”一个或一个以上“ 前面的字符(*是0或多 ...
随机推荐
- Linux基础之命令练习Day3-文件管理:cat,tar,gzip,vim,ln
一. 文件合并 cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [ ...
- 在WinServer上安装小红伞杀毒软件的经验总结
作者:朱金灿 来源:http://blog.csdn.net/clever101 在WinServer2008或WinServer2012不能直接安装小红伞杀毒软件的免费版,需要安装服务器版.我手头并 ...
- Android SQLite案例
重点掌握execSQL()和rawQuery()方法,rawQuery()方法用于执行select语句. SQLiteOpenHelper,实现了onCreate和onUpgrade方法. 第一次创建 ...
- 谈谈CSS性能
CSS性能优化 1.衡量属性和布局的消耗代价: 2.探索W3C的性能优化新规范: 3.用测试数据判断优化策略. 慎重选择高消耗的样式 1.box-shadows; 2.border-radius; 3 ...
- c# 修改winform中app.config的配置值
public bool ChangeConfig(string AppKey,string AppValue) { bool result = true; try { XmlDocument xDoc ...
- mongodb数据库备份恢复-windows系统
备份语法: mongodump命令脚本语法如下: >mongodump -h dbhost -d dbname -o dbdirectory -h: MongDB所在服务器地址,例如:127.0 ...
- Rabbit MQ config文件解析
Rabbit MQ config文件解析 tcp_listeners:用于监听AMQP连接的端口或主机名/对(不带TLS),默认端口:5672 2.numtcpacceptors :将接受TCP侦听器 ...
- excel操作方法
excel分列: http://jingyan.baidu.com/article/54b6b9c0d53f622d593b4772.html excel分列: http://jingyan.baid ...
- 《C++ Primer Plus》读书笔记之二—复合类型
二.第四章 复合类型 1.C-风格字符串:C-风格字符串具有一种特殊的性质:以空字符结尾,空字符被写成\0,其ASC||编码为0,用来标记字符串的结尾.例如: char dog[5]={'b','e ...
- mysql登录:access denied for user 'root'@'localhost'(using password:YES)
mysql登录: access denied for user 'root'@'localhost'(using password:YES) 解决: use mysql; select user,ho ...