JavaScript 正则表达式 可选捕获组

6

给定以下两个字符串:

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
1个回答

4
答案是将可选的WHERE子句用一个非捕获组括起来,并使其可选。我还稍微修改了一下,因为您可能不想匹配任何字符.。您可以随时改回去。
var regex = /select\s+([\w ,]+)\s+from\s+(\w+)(?:\s+where([\w =]+))?/gi;

演示

但是如果不提到使用正则表达式处理代码是一个糟糕的主意,我会感到遗憾。你总是可以使用 SQL 解析器。


非常感谢,真的! - John Jackson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接