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 相关文章推荐
解决AJAX中跨域访问出现'没有权限'的错误
Aug 20 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
Sep 08 Javascript
用JQUERY增删元素的代码
Feb 14 Javascript
js无刷新操作table的行和列
Mar 27 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
Oct 14 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 Javascript
Validform验证时可以为空否则按照指定格式验证
Oct 20 Javascript
Angular 实现输入框中显示文章标签的实例代码
Nov 07 Javascript
发布Angular应用至生产环境的方法
Dec 10 Javascript
js中arguments对象的深入理解
May 14 Javascript
layui实现二维码弹窗、并下载到本地的方法
Sep 25 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 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 计划任务 检测用户连接状态
2012/03/29 PHP
php变量范围介绍
2012/10/15 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
php中static和const关键字用法分析
2016/12/07 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
python中 chr unichr ord函数的实例详解
2017/08/06 Python
python实现扫描日志关键字的示例
2018/04/28 Python
django 消息框架 message使用详解
2019/07/22 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
Python实现画图软件功能方法详解
2020/07/28 Python
Python如何定义有默认参数的函数
2020/08/10 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
python 高阶函数简单介绍
2021/02/19 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
建筑管理专业求职信
2014/07/28 职场文书
2015年试用期工作总结
2014/12/12 职场文书
销售助理岗位职责
2015/02/11 职场文书
学期个人自我总结
2015/02/13 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
Javascript webpack动态import
2022/04/19 Javascript