首页 > 编程 > JavaScript > 正文

JS正则表达式之非捕获分组用法实例分析

2019-11-19 18:13:56
字体:
来源:转载
供稿:网友

本文实例讲述了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,cdalert(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')

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools.VeVB.COm/regex/javascript

正则表达式在线生成工具:
http://tools.VeVB.COm/regex/create_reg

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript正则表达式技巧大全》、《JavaScript替换操作技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript中json操作技巧总结》、《JavaScript错误与调试技巧总结》及《JavaScript数学运算用法总结

希望本文所述对大家JavaScript程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表