鉴于这两个字符串:
let query = "select color, year from car where color = blue and year = 2002";
或
let query = "select color, year from car";
我使用RegExp
创建了以下String.prototype.match
来提取列,表名和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'
]
对于第二个查询,我得到一个null,如果我尝试更改RegExp以考虑where子句是可选的,它会更改捕获组并且也不起作用:
var results = query.match(/select (.*) from (.*)( where (.*))?/);
在这种情况下,有关如何使用捕获组的任何想法,其中一个是可选的吗?我有其他策略来实现,但我真的想继续使用捕获组。
由于
答案 0 :(得分:2)
答案是用非捕获组包围可选的WHERE子句并使其成为可选项。我也稍微改了一下因为您可能不想匹配任何字符.
。你可以随时改变它。
var regex = /select\s+([\w ,]+)\s+from\s+(\w+)(?:\s+where([\w =]+))?/gi;
如果我没有提到使用正则表达式处理代码是一个可怕的想法,我会失职。您始终可以使用SQL解析器。