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 相关文章推荐
JQUERY 浏览器判断实现函数
Aug 20 Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
Jun 21 Javascript
前台js改变Session的值(用ajax实现)
Dec 28 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
jQuery的缓存机制浅析
Jun 07 Javascript
JavaScript利用正则表达式去除日期中的-
Jun 09 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
Nov 20 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
Feb 24 Javascript
JavaScript实现百度搜索框效果
Mar 26 Javascript
JavaScript定时器设置、使用与倒计时案例详解
Jul 08 Javascript
深入了解JavaScript 防抖和节流
Sep 12 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批量生成随机用户名
2008/07/10 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
JS实现的排列组合算法示例
2019/07/16 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
python实现计算资源图标crc值的方法
2014/10/05 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
python set内置函数的具体使用
2019/07/02 Python
车间副主任岗位职责
2013/12/24 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
生物学专业求职信
2014/07/23 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
博士导师推荐信
2015/03/25 职场文书
家长通知书家长意见
2015/06/03 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
比较几种Redis集群方案
2021/06/21 Redis
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Python制作动态字符画的源码
2021/08/04 Python