Javascript正则表达式缺少组

时间:2013-03-03 20:43:29

标签: javascript regex

我有这个正则表达式在Java环境中按预期工作,但我无法使其在Javascript上正常工作:

/^(?:select\s+)?(?:([\w\d]+)?\.?([\w\d]+))?(?:\s*\,\s*)?(?:([\w\d]+)?\.?([\w\d]+))?(?:\s*from\s+)([\w\d\.]+)\s*([\w\d]+)?$/g

此表达式应与这些输入行匹配:

select a.id, a.name from public.blah a

select a, a.name from public.blah a

select id, name from blah

a.id, name from brah a

from blah a

对于我期望的小组:

1:第一个投影别名(a)(如果有的话)

2:第一个投影属性(id),如果有的话

3:第二个投影别名(a)(如果有的话)

4:第二个投影属性(名称)(如果有)

5:关系名称(public.blah)

6:关系别名(a)如果有的话

正则表达式在Javascript上匹配,但它无法获取组。必须要有一些东西需要改变才能使其发挥作用。

var optionsPattern = /^(?:select\s+)?(?:([\w\d]+)?\.?([\w\d]+))?(?:\s*\,\s*)?(?:([\w\d]+)?\.?([\w\d]+))?(?:\s*from\s+)([\w\d\.]+)\s*([\w\d]+)?$/g;

var text = 'select id, text from options.test';

var match = text.match(optionsPattern);

if(match) {
  alert(match[0]); // select id, text from options.test
  alert(match[1]); // undefined 
}

你们有什么需要改变的线索吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

删除g标志。它正在将你的正则表达式从“匹配并返回子模式”改为“搜索并返回所有匹配”