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验证身份证号有效性并提示对应信息
Oct 19 Javascript
AngularJS 使用 UI Router 实现表单向导
Jan 29 Javascript
Webwork 实现文件上传下载代码详解
Feb 02 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
JS实现页面打印(整体、局部)
Aug 18 Javascript
js实现数组和对象的深浅拷贝
Sep 30 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
Dec 18 Javascript
收集前端面试题之url、href、src
Mar 22 Javascript
create-react-app安装出错问题解决方法
Sep 04 Javascript
vue+axios实现文件下载及vue中使用axios的实例
Sep 21 Javascript
vue集成chart.js的实现方法
Aug 20 Javascript
原生js实现九宫格拖拽换位
Jan 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 checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
javascript 写的一个简单的timer
2009/07/30 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
python中cPickle用法例子分享
2014/01/03 Python
python字符串排序方法
2014/08/29 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
个人求职信范文分享
2014/01/06 职场文书
顶岗实习计划书
2014/01/10 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
2014年度安全工作总结
2014/12/04 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
活动宣传稿范文
2015/07/23 职场文书
《迟到》教学反思
2016/02/24 职场文书
导游词之湖北武当山
2019/09/23 职场文书
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS
vue实现在data里引入相对路径
2022/06/05 Vue.js