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 相关文章推荐
JavaScript入门教程 Cookies
Jan 31 Javascript
javascript五图轮播切换实用版
Aug 17 Javascript
js防止页面被iframe调用的方法
Oct 30 Javascript
Jquery跨域获得Json的简单实例
May 18 Javascript
AngularJS自定义服务与fliter的混合使用
Nov 24 Javascript
vue引入jq插件的实例讲解
Sep 12 Javascript
jQuery zTree 异步加载添加子节点重复问题
Nov 29 jQuery
vue实现打印功能的两种方法
Sep 07 Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
Jun 18 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
Nov 03 Javascript
JS的深浅复制详细
Oct 16 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判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
外贸英语毕业生自荐信
2013/11/14 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
自主实习接收函
2014/01/13 职场文书
政府采购方案
2014/06/12 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
学习十八大的心得体会
2014/09/12 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
质量负责人岗位职责
2015/02/15 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
干部考核工作总结
2015/08/12 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python