从正则表达式中排除特定子字符串

时间:2010-05-06 18:09:04

标签: .net regex

我正试图通过正则表达式来破坏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来打击这个。

4 个答案:

答案 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”附加到字符串吗?这有点像黑客,但它应该工作。