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 相关文章推荐
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
Apr 01 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
ParseInt函数参数设置介绍
Jan 02 Javascript
jquery mobile界面数据刷新的实现方法
May 28 Javascript
解决linux下node.js全局模块找不到的问题
May 15 Javascript
Angular中sweetalert弹框的基本使用教程
Jul 22 Javascript
layui的select联动实现代码
Sep 28 Javascript
基于ts的动态接口数据配置的详解
Dec 18 Javascript
如何用JS模拟实现数组的map方法
Jul 30 Javascript
Vue 同步异步存值取值实现案例
Aug 05 Javascript
javascript对象3个属性特征
Nov 17 Javascript
JS封装cavans多种滤镜组件
Feb 15 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
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
php自动加载方式集合
2016/04/04 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
JsDom 编程小结
2011/08/09 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
业务员岗位职责
2013/11/16 职场文书
趣味活动策划方案
2014/02/08 职场文书
超市促销活动方案
2014/03/05 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
学校安全责任书
2014/04/14 职场文书
大学生英语演讲稿
2014/04/24 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
2014年店长工作总结
2014/11/17 职场文书
2014年宣传工作总结
2014/11/18 职场文书
见义勇为事迹材料
2014/12/24 职场文书
房屋认购协议书
2015/01/29 职场文书
故意伤害辩护词
2015/05/21 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
Python经常使用的一些内置函数
2022/04/11 Python