2011-05-25 86 views
1

所以我一直在努力的這兩個問題的答案結合正面看:
C# split string but keep split chars\seperators
Regex to match multiple strings正則表達式匹配多個字符串背後

基本上我希望能夠分裂圍繞某些字符串並且在Regex.Split()的輸出數組中也有分割字符串。以下是我迄今爲止嘗試:

// ** I'd also like to have UNION ALL but not sure how to add that 
private const string CompoundSelectRegEx = @"(?<=[\b(UNION|INTERSECT|EXCEPT)\b])"; 
string sql = "SELECT TOP 5 * FROM Persons UNION SELECT TOP 5 * FROM Persons INTERSECT SELECT TOP 5 * FROM Persons EXCEPT SELECT TOP 5 * FROM Persons"; 

string[] strings = Regex.Split(sql, CompoundSelectRegEx); 

的問題是,它開始像匹配E和ü單個字符,所以我得到的字符串數組不正確。

我也想圍繞UNION ALL進行匹配,但因爲那不僅僅是一個單詞而是一個字符串我不知道如何將它添加上面的正則表達式,所以如果有人能指出我在正確的方向,那太好了!

謝謝!

+0

「except | union | intersect」 – 2011-05-25 15:42:06

回答

2

如果你想拆分這些單詞並將它們包含在結果中,只需在它們上面交替並將它們放在一個組中。無需查看。這種模式應該適合你的需求:

string pattern = @"\b(UNION(?:\sALL)?|INTERSECT|EXCEPT)\b"; 

(?:\sALL)?使得可選匹配字ALL(?:...)部分表示匹配但不捕獲指定的模式。尾部的尾部?使其成爲可選項。如果你想調整結果,你可以在模式結尾添加一個\s*

請注意,這可能適用於簡單的SQL語句,但一旦開始處理嵌套查詢,上述方法可能會失效。在那一刻,正則表達式可能不是最好的解決方案,你應該開發一個解析器。