2010-05-06 156 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

相關問題