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代码
Jan 12 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
Aug 13 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
jquery实现图片左右切换的方法
May 07 Javascript
javascript函数特点实例分析
May 14 Javascript
判断输入的字符串是否是日期格式的简单方法
Jul 11 Javascript
JavaScript严格模式详解
Jan 16 Javascript
使用Bootrap和Vue实现仿百度搜索功能
Oct 26 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
Dec 03 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
Vue基于localStorage存储信息代码实例
Nov 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 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
python正则表达式之作业计算器
2016/03/18 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
农救科工作职责
2013/11/27 职场文书
优秀共产党员先进事迹
2014/01/27 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
电子商务专业求职信
2014/07/10 职场文书
倡议书格式及范文
2015/04/29 职场文书
工程款申请报告
2015/05/15 职场文书
我的长征观后感
2015/06/09 职场文书
聘任书的格式及模板
2019/10/28 职场文书
使用scrapy实现增量式爬取方式
2022/06/21 Python