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