JavaScript RegExp可选捕获组

时间:2017-03-23 12:42:51

标签: javascript regex

鉴于这两个字符串:

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 (.*))?/);

在这种情况下,有关如何使用捕获组的任何想法,其中一个是可选的吗?我有其他策略来实现,但我真的想继续使用捕获组。

由于

1 个答案:

答案 0 :(得分:2)

答案是用非捕获组包围可选的WHERE子句并使其成为可选项。我也稍微改了一下因为您可能不想匹配任何字符.。你可以随时改变它。

var regex = /select\s+([\w ,]+)\s+from\s+(\w+)(?:\s+where([\w =]+))?/gi;

DEMO

如果我没有提到使用正则表达式处理代码是一个可怕的想法,我会失职。您始终可以使用SQL解析器。