我正试图通过正则表达式来破坏SQL查询。如果存在ORDER BY,我的目标基本上就是抓住FROM和ORDER BY之间的内容。
因此,例如对于查询:SELECT * FROM TableA WHERE ColumnA=42 ORDER BY ColumnB
它应该捕获TableA WHERE ColumnA=42
,并且它还应该捕获ORDER BY表达式是否存在。
我能来的最接近的是SELECT (.*) FROM (.*)(?=(ORDER BY))
,如果没有ORDER BY则会失败。
希望我错过了一些明显的东西。在过去的一小时里,我一直在用Expresso来打击这个。
答案 0 :(得分:1)
我认为你在寻找这个:
^SELECT (.+) FROM (.+?)( ORDER BY (.+))?$
请注意,我强制了字符串的起点和终点。这样,将评估可选的order by,如果它不存在,则其余代码将包含在第二个匹配组中。
P.S。您当然可以根据需要进行编辑..我也将最后一个.+
放在一个组中,以便您可以通过参数轻松访问该订单..如果您不需要它 - 您可以删除它们:P
与SELECT中的第一个相同,但我想你已经知道了:)
答案 1 :(得分:0)
你需要在整个子表达式中包含ORDER BY,然后在它后面放一个?
:
SELECT (.*) FROM (.*?) (ORDER BY (.*))?$
您还需要将FROM之后的模式设置为非贪婪的匹配.*?
,否则它将始终使用ORDER BY,并且最终部分永远不会匹配。
答案 2 :(得分:0)
只需在正则表达式中添加更改:
SELECT (.*) FROM (.*)(?=(ORDER BY|\Z|$))
答案 3 :(得分:0)
你可以在应用正则表达式之前将“ORDER BY”附加到字符串吗?这有点像黑客,但它应该工作。