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 小贴士一星期合集
Apr 07 Javascript
去掉gridPanel表头全选框的小例子
Jul 18 Javascript
使用js实现数据格式化
Dec 03 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 Javascript
Javascript使用function创建类的两种方法(推荐)
Nov 19 Javascript
基于javascript的异步编程实例详解
Apr 10 Javascript
vue中使用ueditor富文本编辑器
Feb 08 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
JavaScript图片旋转效果实现方法详解
Jun 28 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 Javascript
nuxt 实现在其它js文件中使用store的方式
Nov 05 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
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
php实现计数器方法小结
2015/01/05 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
php实现两个数组相加的方法
2015/02/17 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
Prototype Class对象学习
2009/07/19 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
2010/07/06 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
应用数学自荐书范文
2013/11/24 职场文书
关于毕业的广播稿
2014/01/10 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
营运督导岗位职责
2015/04/10 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript