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 BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
Javascript 面向对象 对象(Object)
May 13 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
程序员必知35个jQuery 代码片段
Nov 05 Javascript
Jquery中巧用Ajax的beforeSend方法
Jan 20 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
Oct 17 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
Nov 17 Javascript
IntersectionObserver API 详解篇
Dec 11 Javascript
JS简单实现数组去重的方法分析
Oct 14 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 Javascript
通过滑动翻页效果实现和移动端click事件问题
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
深入apache host的配置详解
2013/06/09 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
python备份文件的脚本
2008/08/11 Python
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
keras中的backend.clip用法
2020/05/22 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
护理个人求职信范文
2014/01/08 职场文书
自动化毕业生专业自荐书范文
2014/02/04 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python