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原型和闭包系列理解(随手笔记9)
Dec 24 Javascript
如何用js实现鼠标向上滚动时浮动导航
Jul 18 Javascript
Bootstrap源码解读导航(6)
Dec 23 Javascript
canvas绘制七巧板
Feb 03 Javascript
微信小程序中的swiper组件详解
Apr 14 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
浅谈vue项目可以从哪些方面进行优化
May 05 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
微信小程序methods中定义的方法互相调用的实例代码
Aug 07 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
Jul 04 Javascript
javascript贪吃蛇游戏设计与实现
Sep 17 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
解析crontab php自动运行的方法
2013/06/24 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
子页向父页传值示例
2013/11/27 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
python 开发的三种运行模式详细介绍
2017/01/18 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
优质的学校老师推荐信
2013/10/28 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
2019各种保证书范文
2019/06/24 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript