.*?(?<=(?: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;
我必须遗漏一些东西,最后一部分不被野外卡吃掉...... 它输出:“table1,table2table3,table4WHERE bla;”
我尝试与'$'组合,但要么它与任何东西都不匹配,要么它保留完整的最后一部分
答案 0 :(得分:1)
请注意,您提供的链接会进行多次替换。它制作了三个匹配并为每个匹配做了替代。您可以使用|\0|
代替\1
来查看此内容。
所以问题是在所有这些匹配之后你在最后留下了垃圾。解决方案是让匹配消耗字符直到下一个匹配的相关部分的开头。
这可以通过使用否定前瞻来完成。 - 将(.(?!SELECT))*
添加到正则表达式的末尾;
.*?(?<=(?:FROM|JOIN))\s*(.*?)\s*(?=(?:ON|JOIN|WHERE|LIMIT|GROUP|ORDER|\(|;))(.(?!SELECT))*