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中instanceof与typeof运算符的用法及区别详细解析
Nov 19 Javascript
jquery统计输入文字的个数并对其进行判断
Jan 07 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
Dec 04 Javascript
使用Javascript实现选择下拉菜单互移并排序
Feb 23 Javascript
浅析jQuery 3.0中的Data
Jun 14 Javascript
Bootstrap插件全集
Jul 18 Javascript
React Native实现简单的登录功能(推荐)
Sep 19 Javascript
深入理解JavaScript中的尾调用(Tail Call)
Feb 07 Javascript
bootstrap弹出层的多种触发方式
May 10 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 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 XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
微信小程序之选项卡的实现方法
2017/09/29 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
树莓派实现移动拍照
2019/06/22 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
教师自我鉴定范文
2013/11/10 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
中学生运动会入场词
2014/02/12 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
学习普通话的体会
2014/11/07 职场文书
同学毕业留言寄语
2015/02/27 职场文书
2015年妇委会工作总结
2015/05/22 职场文书