2017-04-10 104 views
1

我有一個像這樣的sql語句,我們需要修改它以供我們自己使用:C#正則表達式:匹配以x開頭並以y結尾的字符串,不包括結尾部分並匹配模式的最後一次出現

SELECT distinct [testCountry].[Division] as c0 
FROM (....) AS testCountry 
WHERE ([testCountry].[Division] <> '' and [testCountry].[Division] is not null) 
ORDER BY [testCountry].[Division] asc 

(....)部分包含其他sql語句,也可能包含關鍵字SELECT, WHERE, ORDER BY。 這裏我想刪除末尾的Where子句「WHERE ([testCountry].[Division] <> '' and [testCountry].[Division] is not null)

如何爲此構造正則表達式?

我已經試過某事像這樣:

string res = Regex.Replace(originalSql, @"(WHERE[\S\s]*?)(ORDER BY)", "$2"); 

但它會刪除所有WHERE在其他地方,然後ORDER BY。 另外如何更正確地編寫正則表達式?

謝謝!

+0

爲什麼使用'[\ S \ s]'而不是點'''? – juharr

+0

原始的sql語句有換行符,就像你會在sql server management studio中看到的那樣 – strisunshine

+0

你知道有一些設置讓你告訴它是否應該或不應該匹配換行符。 – juharr

回答

2

如果符合其他WHERE S,那麼你不必擔心更換它們。嘗試

string res = Regex.Replace(originalSql, @"(.*)(WHERE[\S\s]*?)(ORDER BY)", "$1$3"); 

通過貪婪匹配的性質,這將確保只有最後WHERE子句匹配。

備案,我更喜歡Joshua's approach。儘可能避免使用正則表達式,任何追隨你的人(包括未來的自己)都會很感激。

+0

謝謝!我再次將*改爲[\ S \ s] *,但我認爲它以簡潔的方式完成了我想要做的事情:) – strisunshine

+0

這是否工作正常?你有沒有測試過它,因爲它對我來說似乎很貪婪? –

+1

如果您使用[單行模式](https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions(v = vs.110).aspx),那麼您仍然可以使用'.' 。 – JDB

2

我知道這不是你要求的正則表達式解決方案,但它是一個解決方案。

var sql = "WHERE THIS = THIS WHERE this = that "; 

var index = sql.LastIndexOf("WHERE"); 

var sqlnew = sql.Substring(0, index); 

你可以用上面的方法去掉最後的WHERE語句。然後在末尾附加你的聲明要容易得多。

如果你還可以得到最後一個WHERE語句並將你需要的正則表達式更容易。

var whereStatement = sql.Substring(index, sql.length); 

然後得到你想要的東西例如你給..

string res = Regex.Replace(whereStatement , @"(WHERE[\S\s]*?)(ORDER BY)", "$2"); 
+0

謝謝。這很有用,儘管我需要在任何條款 – strisunshine

+0

之後保留任何內容,但是您已經準備好了解如何執行此操作?我修改了我的帖子,你可以得到最後的聲明和正則表達式你需要什麼等 –

+0

@strisunshine我建議你使用'sql.Substring(0,sql.LastIndexOf(「WHERE」))+ sql.Substring(sql .LastIndexOf(「ORDER BY」));'比正則表達式更容易閱讀和維護(在我看來)。 – JDB

相關問題