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 相关文章推荐
学习ExtJS(一) 之基础前提
Oct 07 Javascript
JavaScript在多浏览器下for循环的使用方法
Nov 07 Javascript
JQuery动画和停止动画实例代码
Mar 01 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
写得不错的jquery table鼠标经过变色代码
Sep 27 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
May 10 Javascript
jQuery实现产品对比功能附源码下载
Aug 09 Javascript
js利用appendChild对标签进行排序的实现方法
Oct 16 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
May 04 Javascript
vue监听scroll的坑的解决方法
Sep 07 Javascript
Vue+Openlayers自定义轨迹动画
Sep 24 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新手上路(十)
2006/10/09 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
js实现图片轮播效果
2015/12/19 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
基于python实现微信模板消息
2015/12/21 Python
django如何连接已存在数据的数据库
2018/08/14 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
金融专业推荐信
2013/11/14 职场文书
高中军训感言800字
2014/03/05 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
公司慰问信范文
2015/03/23 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技