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 相关文章推荐
让iframe自适应高度(支持XHTML,支持FF)
Jul 24 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
JS实现根据当前文字选择返回被选中的文字
May 21 Javascript
js Canvas绘制圆形时钟效果
Feb 17 Javascript
JavaScript实现无刷新上传预览图片功能
Aug 02 Javascript
在vue中使用jointjs的方法
Mar 24 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
Oct 15 Javascript
javascript中的数据类型检测方法详解
Aug 07 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
Nov 20 Javascript
Vue实现简易购物车页面
Dec 30 Vue.js
vue 项目@change多个参数传值多个事件的操作
Jan 29 Vue.js
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
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
vue+canvas实现移动端手写签名
2020/05/21 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
python计算方程式根的方法
2015/05/07 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
python的turtle库使用详解
2019/05/10 Python
python实现的汉诺塔算法示例
2019/10/23 Python
关于numpy数组轴的使用详解
2019/12/05 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
python实现文字版扫雷
2020/04/24 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
Java程序员面试90题
2013/10/19 面试题
应届护士求职信范文
2014/01/26 职场文书
模具数控专业自荐信
2014/01/27 职场文书
国庆宣传标语
2014/06/30 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
人力资源部岗位职责
2015/02/11 职场文书
支行行长岗位职责
2015/02/15 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
有关浪费资源的建议书
2015/09/14 职场文书