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 常用代码技巧大收集
Feb 25 Javascript
JS 拼图游戏 面向对象,注释完整。
Jun 18 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
Nov 05 Javascript
Javascript表格翻页效果实现思路及代码
Aug 23 Javascript
jquery实现键盘左右翻页特效
Apr 30 Javascript
分享15个大家都熟知的jquery小技巧
Dec 02 Javascript
AngularJS 中文API参考手册
Jul 28 Javascript
vue.js实现单选框、复选框和下拉框示例
Jul 18 Javascript
解决Linux无法正常安装与卸载Node.js的方法
Jan 19 Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 Javascript
layui 实现加载动画以及非真实加载进度的方法
Sep 23 Javascript
html实现随机点名器的示例代码
Apr 02 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/12/06 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
请离开include_once和require_once
2013/07/18 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
python字典get()方法用法分析
2015/04/17 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
Python中函数参数匹配模型详解
2019/06/09 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
Python接收手机短信的代码整理
2020/08/02 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
经贸韩语专业大学生职业规划
2014/02/14 职场文书
社会学专业求职信
2014/02/24 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
文明礼仪主题班会
2015/08/13 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
Redis Lua脚本实现ip限流示例
2022/07/15 Redis