Javascript正则表达式:匹配项如何共享相同的关键字?

Javascript正则表达式:匹配项如何共享相同的关键字?,javascript,regex,Javascript,Regex,我有一个从SQL select语句中提取表的正则表达式。正则表达式在两个SQL语句上运行,它们应该返回相同的匹配项:[“table1t1,table2t2”,“table3t3”] 第一个SQL工作正常(请参见console.log),第二个SQL不工作(显然没有检测到table3 t3,因为join关键字既是上一个匹配中的最后一个关键字,也是第二个匹配中的第一个关键字 在尝试匹配时,有没有办法告诉正则表达式“返回”呢 Javascript: var sql = "select * from t

我有一个从SQL select语句中提取表的正则表达式。正则表达式在两个SQL语句上运行,它们应该返回相同的匹配项:
[“table1t1,table2t2”,“table3t3”]

第一个SQL工作正常(请参见console.log),第二个SQL不工作(显然没有检测到
table3 t3
,因为
join
关键字既是上一个匹配中的最后一个关键字,也是第二个匹配中的第一个关键字

在尝试匹配时,有没有办法告诉正则表达式“返回”呢

Javascript:

var sql = "select * from table1 t1, table2 t2 where t1.col in (select col from table3 t3)";

var myRegexp = /(:?from|join)\s(.*?)(:?\s+where|\s+on|\s+inner|\s+outer|\s+full|\s+left|\s+right|\s+join|\s*\))/gi;

console.log(getMatches(sql,myRegexp,2));

sql = "SELECT column FROM table1 t1, table2 t2 join table3 t3 on t1.column_name=t3.column_name";

console.log(getMatches(sql,myRegexp,2));

function getMatches(string, regex, index) {
    var matches = [];
    var match;
    while (match = regex.exec(string)) {
        matches.push(match[index]);
    }
    return matches;
}

我想我必须在前面加上一句强制性的“这是一个好主意吗?”一般来说,Regex并不是解决这类问题的答案(例如解析)

也就是说,我想这就是你想要的

有一个被称为的方法,它指示正则表达式引擎确保匹配后面有一些东西,而不是匹配的一部分

正向前瞻的工作原理是一样的。
q(?=u)
匹配 后跟一个
u
,而不使u成为匹配的一部分。正 lookahead构造是一对括号,带有开头 括号后跟问号和等号


也有匹配的正/负查找,但我不相信JavaScript支持它。

我想我必须在前面加上一句强制性的“这是一个好主意吗?”一般来说,正则表达式并不能解决类似的问题(例如解析)

也就是说,我想这就是你想要的

有一个被称为的方法,它指示正则表达式引擎确保匹配后面有一些东西,而不是匹配的一部分

正向前瞻的工作原理是一样的。
q(?=u)
匹配 后跟一个
u
,而不使u成为匹配的一部分。正 lookahead构造是一对括号,带有开头 括号后跟问号和等号


也有匹配的正/负查找,但我不相信JavaScript支持它。

我想我必须在前面加上一句强制性的“这是一个好主意吗?”一般来说,正则表达式并不能解决类似的问题(例如解析)

也就是说,我想这就是你想要的

有一个被称为的方法,它指示正则表达式引擎确保匹配后面有一些东西,而不是匹配的一部分

正向前瞻的工作原理是一样的。
q(?=u)
匹配 后跟一个
u
,而不使u成为匹配的一部分。正 lookahead构造是一对括号,带有开头 括号后跟问号和等号


也有匹配的正/负查找,但我不相信JavaScript支持它。

我想我必须在前面加上一句强制性的“这是一个好主意吗?”一般来说,正则表达式并不能解决类似的问题(例如解析)

也就是说,我想这就是你想要的

有一个被称为的方法,它指示正则表达式引擎确保匹配后面有一些东西,而不是匹配的一部分

正向前瞻的工作原理是一样的。
q(?=u)
匹配 后跟一个
u
,而不使u成为匹配的一部分。正 lookahead构造是一对括号,带有开头 括号后跟问号和等号


还有匹配的正向/负向查找,但我认为JavaScript不支持它。

此正则表达式应提供更准确的结果:

/(?:from|join|,)\s(.*?)(?=\s+where|\s+on|\s+inner|\s+outer|\s+full|\s+left|\s+right|\s+join|\s*,|\s*\))/
正则表达式:
fiddle:

此正则表达式应提供更准确的结果:

/(?:from|join|,)\s(.*?)(?=\s+where|\s+on|\s+inner|\s+outer|\s+full|\s+left|\s+right|\s+join|\s*,|\s*\))/
正则表达式:
fiddle:

此正则表达式应提供更准确的结果:

/(?:from|join|,)\s(.*?)(?=\s+where|\s+on|\s+inner|\s+outer|\s+full|\s+left|\s+right|\s+join|\s*,|\s*\))/
正则表达式:
fiddle:

此正则表达式应提供更准确的结果:

/(?:from|join|,)\s(.*?)(?=\s+where|\s+on|\s+inner|\s+outer|\s+full|\s+left|\s+right|\s+join|\s*,|\s*\))/
正则表达式:
fiddle:

如果您不介意逗号分隔的表是单个匹配项,那么这将起作用:

/(?:from|join)\s+(.*?)(?:\)|\s+(?=where|on|inner|outer|full|left|right|join))/gi
例如,它为您问题中的示例提供了
“table1 t1、table2 t2”、“table3 t3”
(在匹配项周围添加引号)


另外,正如@GUIDO所说,
(?:)
是非捕获组语法,因此您需要将函数调用更改为
getMatches(sql,myRegexp,1)
w/this regex。

如果您不介意逗号分隔的表是单个匹配项,那么这将起作用:

/(?:from|join)\s+(.*?)(?:\)|\s+(?=where|on|inner|outer|full|left|right|join))/gi
例如,它为您问题中的示例提供了
“table1 t1、table2 t2”、“table3 t3”
(在匹配项周围添加引号)


另外,正如@GUIDO所说,
(?:)
是非捕获组语法,因此您需要将函数调用更改为
getMatches(sql,myRegexp,1)
w/this regex。

如果您不介意逗号分隔的表是单个匹配项,那么这将起作用:

/(?:from|join)\s+(.*?)(?:\)|\s+(?=where|on|inner|outer|full|left|right|join))/gi
例如,它为您问题中的示例提供了
“table1 t1、table2 t2”、“table3 t3”
(在匹配项周围添加引号)


另外,正如@GUIDO所说,
(?:)
是非捕获组语法,因此您需要将函数调用更改为
getMatches(sql,myRegexp,1)
w/this regex。

如果您不介意逗号分隔的表是单个匹配项,那么这将起作用:

/(?:from|join)\s+(.*?)(?:\)|\s+(?=where|on|inner|outer|full|left|right|join))/gi
例如,它为您问题中的示例提供了
“table1 t1、table2 t2”、“table3 t3”
(在匹配项周围添加引号)


另外,正如@GUIDO所说,
(?:)
是非捕获组语法,因此您需要将函数调用更改为
getMatches(sql,myRegexp,1)
w/这个正则表达式。

您已经反转了非捕获组
:?
,无论如何,您确定用正则表达式解析sql是个好主意吗?我不想解析整个sql,只是为了得到表名您反转了非捕获组
:?
,无论如何,您确定用正则表达式解析sql是个好主意吗?我不想解析整个sql,只是为了得到表na