javascript正则表达式:非捕获分组的一个使用例子
2015-11-21 10:20
561 查看
最近在看JsonSQL的时候,通过源码中的一段正则表达式,了解到了什么是非捕获分组以及它的使用场景。在js中,正常的捕获分组格式是(XX),非捕获分组格式为(?:XX)。我们先从正则表达式数量词说起,如果我们要求字符b至少出现一次,可以使用正则/b+/;如果要求ab至少出现一次,那么必需使用/(ab)+/,不能用/ab+/。也就是说,如果想对多个字符使用数量词,必需要用圆括号。
可以看出捕获分组和非捕获分组的区别了吧:非捕获分组,只是用来匹配,并不会提取分组内容。也就是说,如果我们只想用圆括号将一些字符用数量词修饰,并不需要这个分组的内容,这就是非捕获分组。
下面这段代码用来提取sql语句中的各个子片段,大量使用了非捕获分组,可以细细品味下。
关于这段正则有几个地方解释下:
1.字段名和表明只能由大小写字母、数字和下划线组成。
2.where后面的条件必须放在()中,否则不能匹配。这个和真正的SQL是不同的。
3.select后面的字段有3种格式:单个字段、多个字段(以逗号分隔)、所有字段(用*表示)。
4.where子语句、order by子语句、limit子语句都是可选的。
如下面这段文本,能够匹配上面的正则:
select age from data where (name=='aty')
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')
相关文章推荐
- js几秒以后倒计时跳转示例
- javascript实现Email邮件显示与删除功能
- jsp字符拦截器
- IOS-30-Hybrid混合开发(二):实现javaScript页面与OC界面互调demo(iOS7之前与之后javascriptCore.framework)
- BZOJ4327 : JSOI2012 玄武密码
- 【JS关键字】
- ExtJS4.2学习(14)基于表格的扩展插件(2)(转)
- 学习日记:json之what,why,where,how及应用
- js原生封装自定义滚动条
- ExtJS4.2学习(13)基于表格的扩展插件---rowEditing
- webpack bable-loader升级无法编译jsx es6
- javascript实现Email邮件显示与删除功能
- JavaScript实现自动生成网页元素功能(按钮、文本等)
- js实现索引图片切换效果
- javascript实现动态统计图开发实例
- 超详细的javascript数组方法汇总
- 分享经典的JavaScript开发技巧
- js if
- js 参数带0丢失的问题
- JS如何获取多个相同class标签并分别再输出各自的文本