为什么REGEX不起作用?

时间:2014-06-03 10:36:58

标签: regex

.*?(?<=(?:FROM|JOIN))\s*(.*?)\s*(?=(?:ON|JOIN|WHERE|LIMIT|GROUP|ORDER|\(|;))

INPUT:

SELECT * FROM (SELECT * FROM table1, table2 WHERE bla,bla GROUP BY bla ORDER bla LIMIT bla) tableTmp UNION SELECT * FROM table3,table4 WHERE bla;

http://regex101.com/r/cE7tT8

我必须遗漏一些东西,最后一部分不被野外卡吃掉...... 它输出:“table1,table2table3,table4WHERE bla;”

我尝试与'$'组合,但要么它与任何东西都不匹配,要么它保留完整的最后一部分

1 个答案:

答案 0 :(得分:1)

请注意,您提供的链接会进行多次替换。它制作了三个匹配并为每个匹配做了替代。您可以使用|\0|代替\1来查看此内容。

所以问题是在所有这些匹配之后你在最后留下了垃圾。解决方案是让匹配消耗字符直到下一个匹配的相关部分的开头。

这可以通过使用否定前瞻来完成。 - 将(.(?!SELECT))*添加到正则表达式的末尾;

.*?(?<=(?:FROM|JOIN))\s*(.*?)\s*(?=(?:ON|JOIN|WHERE|LIMIT|GROUP|ORDER|\(|;))(.(?!SELECT))*