javascript正则表达式:非捕获分组的一个使用例子

原创 2015年11月21日 10:20:24

最近在看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编写的表单提交的例子(包括用正则表达式对数据进行验证)

添加用户      function checkMyForm(){  var username=document.getElementById("username");  var xm=...

java中使用正则表达式校验的一个例子

java中使用正则表达式校验的一个例子 @Test public void Zhengzt() { //正则规则 Pattern pattern=Pattern.compile("^[\...
  • bestcxx
  • bestcxx
  • 2016年07月26日 17:32
  • 934

一个匹配URL的正则表达式例子(带详细解释)

可处理正则表达式的方法有regexp.exec、regexp.test、string、match、string.replace、string.search和string.split。一个带详细解释的匹...

javascript正则表达式中的一个奇葩问题 有关于参数g

今天在写一个表单验证的时候,发现了一个很奇怪的问题,在用正则去匹配一个电话号码的时候,奇数次验证会返回true,偶数次会返回false; 上图 这是注释掉一部分后的代码 这是正则...

java正则表达式使用例子

  • 2017年01月18日 15:38
  • 2.57MB
  • 下载

关于正则表达式分组的一个问题

先来看一段php代码:

Java正则表达式类的各种例子使用

flag的取值范围如下:Pattern.CANON_EQ :当且仅当两个字符的"正规分解(canonical decomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javascript正则表达式:非捕获分组的一个使用例子
举报原因:
原因补充:

(最多只允许输入30个字)