JS正则表达式之⾮捕获分组⽤法实例分析
本⽂实例讲述了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.字段名和表明只能由⼤⼩写字母、数字和下划线组成。js正则表达式判断数字
2.where后⾯的条件必须放在()中,否则不能匹配。这个和真正的SQL是不同的。
3.select后⾯的字段有3种格式:单个字段、多个字段(以逗号分隔)、所有字段(⽤*表⽰)。
4.where⼦语句、order by⼦语句、limit⼦语句都是可选的。
如下⾯这段⽂本,能够匹配上⾯的正则:
select age from data where (name=='aty')
PS:这⾥再为⼤家提供2款⾮常⽅便的正则表达式⼯具供⼤家参考使⽤:
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》及《》
希望本⽂所述对⼤家JavaScript程序设计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论