2010-05-06 155 views
0

我试图通过正则表达式来破坏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在过去的一个小时里试图获得它。

回答

1

我认为你正在寻找这样的:

^SELECT (.+) FROM (.+?)(ORDER BY (.+))?$ 

注意,我强迫字符串的起点和终点。这样,可选顺序将被评估,如果不存在,其余代码将包含在第二个匹配组中。

P.S.你当然可以编辑它,因为你想..我把最后.+在一个组中,以便您可以很容易地访问该命令的params ..如果你不需要它 - 你可以删除它们:P 相同与SELECT中的第一个,但我想你知道已经:)

+0

这只是一个小小的修改(通过捕获将第二捕获表达式和捕获顺序之间的空间移动到顺序中)非常感谢你 – 2010-05-06 18:51:57

+0

非常受欢迎,是的,你是对的。错过了那一个:D 将更新答案(如果可以的话)) – 2010-05-06 18:58:44

0

你需要使整个子表达式包括ORDER BY可选的,通过把一个?后:

SELECT (.*) FROM (.*?) (ORDER BY (.*))?$ 

您还需要后,从图案是一个非贪婪匹配.*?,否则即总是会消耗ORDER BY,最后的部分永远不会匹配。应用正则表达式之前

SELECT (.*) FROM (.*)(?=(ORDER BY|\Z|$))

+0

这在问题中列出的示例查询失败。它仅捕获FROM之后的第一个单词。 – 2010-05-06 18:32:21

+0

啊,是的,我需要确定RE的结尾,以确保它完成整个生产线。固定。 – 2010-05-06 19:53:14

0

只是一个改变添加到您的正则表达式?这有点破解,但它应该工作。

0

你能不能追加“ORDER BY”字符串:

+0

订单已经在字符串上。我期望捕获FROM和ORDER BY之间的内容,如果存在的话 – 2010-05-06 18:29:32

+0

但问题是,“如果ORDER BY表达式不存在,它也应该捕获”。通过强制它在那里,你可以简化正则表达式。 – 2010-05-06 19:39:10

相关问题