给定以下两个字符串:
let query = "select color, year from car where color = blue and year = 2002";
或者
let query = "select color, year from car";
我使用String.prototype.match
创建了以下RegExp
来提取列、表名和where子句(可选)
var results = query.match(/select (.*) from (.*) where (.*)/);
对于第一个查询,结果是我所期望的:
[
'select color, year from car where color = blue and year = 2002',
'color, year',
'car',
'color = blue and year = 2002',
index: 0,
input: 'select color, year from car where color = blue and year = 2002'
]
对于第二个查询,我得到了一个空值,如果我尝试将RegExp更改为考虑where子句是可选的,则会更改捕获组并且也不起作用:
var results = query.match(/select (.*) from (.*)( where (.*))?/);
有没有关于如何在这种情况下使用捕获组的想法,其中一个是可选的?我有其他实现策略,但我真的很想继续使用捕获组。
谢谢
query.match(/select (.*) from (.*)(?:where (.*))?/)
请注意,此处使用了“非捕获”分组括号。 - Scott Weaver