JS正则表达式之非捕获分组用法实例分析


Posted in Javascript onDecember 28, 2016

本文实例讲述了JS正则表达式非捕获分组用法。分享给大家供大家参考,具体如下:

最近在看JsonSQL的时候,通过源码中的一段正则表达式,了解到了什么是非捕获分组以及它的使用场景。在js中,正常的捕获分组格式是(XX),非捕获分组格式为(?:XX)。我们先从正则表达式数量词说起,如果我们要求字符b至少出现一次,可以使用正则/b+/;如果要求ab至少出现一次,那么必需使用/(ab)+/,不能用/ab+/。也就是说,如果想对多个字符使用数量词,必需要用圆括号。

var str = "a1***ab1cd2***c2";
var reg1 = /((ab)+\d+)((cd)+\d+)/i;
var reg2 = /((?:ab)+\d+)((?:cd)+\d+)/i;
alert(str.match(reg1));//ab1cd2,ab1,ab,cd2,cd
alert(str.match(reg2));//ab1cd2,ab1,cd2

可以看出捕获分组和非捕获分组的区别了吧:非捕获分组,只是用来匹配,并不会提取分组内容。也就是说,如果我们只想用圆括号将一些字符用数量词修饰,并不需要这个分组的内容,这就是非捕获分组。

下面这段代码用来提取sql语句中的各个子片段,大量使用了非捕获分组,可以细细品味下。

var returnfields = sql.match(/^\s*SELECT\s+((?:[0-9A-Za-z_]+\s*,\s*)+[0-9A-Za-z_]+ |\*|[0-9A-Za-z_]+)\s+FROM\s+([a-z0-9A-Z_]+)(?: where\s+(.+))?(?:\s+order\s+by\s+([a-z0-9_A-Z]+)(?:\s+(asc|desc|ascnum|descnum)?))?(?:\s+limit\s+(\d+,\d+))?/i);
var ops = {
  fields: returnfields[1].replace('\s','').split(','),
  from: returnfields[2].replace('\s',''),
  where: (returnfields[3] == undefined)? "true":returnfields[3],
  orderby: (returnfields[4] == undefined)? []:returnfields[4].replace('\s','').split(','),
  order: (returnfields[5] == undefined)? "asc":returnfields[5],
  limit: (returnfields[6] == undefined)? []:returnfields[6].replace('\s','').split(',')
};

关于这段正则有几个地方解释下:

1.字段名和表明只能由大小写字母、数字和下划线组成。

2.where后面的条件必须放在()中,否则不能匹配。这个和真正的SQL是不同的。

3.select后面的字段有3种格式:单个字段、多个字段(以逗号分隔)、所有字段(用*表示)。

4.where子语句、order by子语句、limit子语句都是可选的。

如下面这段文本,能够匹配上面的正则:

select age from data where (name=='aty')
Javascript 相关文章推荐
判断页面是关闭还是刷新的js代码
Jan 28 Javascript
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
Firebug入门指南(Firefox浏览器)
Aug 21 Javascript
兼容IE和FF的图片上传前预览js代码
May 28 Javascript
JQuery插件开发示例代码
Nov 06 Javascript
用jquery.sortElements实现table排序
May 04 Javascript
JavaScript操作HTML元素和样式的方法详解
Oct 21 Javascript
Bootstrap源码解读模态弹出框(11)
Dec 28 Javascript
ES6中Generator与异步操作实例分析
Mar 31 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
Nov 07 Javascript
js实现时钟定时器
Mar 26 Javascript
JavaScript实现经典排序算法之插入排序
Dec 28 #Javascript
JavaScript实现经典排序算法之选择排序
Dec 28 #Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
Dec 28 #Javascript
JavaScript实现经典排序算法之冒泡排序
Dec 28 #Javascript
BootStrap Tooltip插件源码解析
Dec 27 #Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 #Javascript
javascript实现文字无缝滚动
Dec 27 #Javascript
You might like
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
javascript 自定义事件初探
2009/08/21 Javascript
jQuery 使用手册(六)
2009/09/23 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
python中的编码知识整理汇总
2016/01/26 Python
pandas string转dataframe的方法
2018/04/11 Python
解决Mac下使用python的坑
2019/08/13 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
全球最大的游戏市场:G2A
2018/07/05 全球购物
一套VC试题
2015/01/23 面试题
公司部门司机岗位职责
2014/01/03 职场文书
团日活动总结书
2014/05/08 职场文书
重阳节简报
2015/07/20 职场文书
高中军训感想
2015/08/07 职场文书
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers