2011-05-04 37 views
1

我有一個字符串,需要根據出現在字符串中的某些子字符串來替換某些內容。例如樣本字符串可能解析C#中的字符串並替換內容

(it.FirstField = "fred" AND it.SecondField = True AND it.ThirdField = False AND it.FifthField = True) 

,我想將它轉換爲:

(it.FirstField = "fred" AND it.SecondField = 'Y' AND it.ThirdField = 'N' AND it.FifthField = True) 

即如果子出現在字符串中,我要真變成「Y」和假到'N',但保留任何其他True/False值。

我的子字符串數組來尋找:

string[] booleanFields = { "SecondField", "ThirdField", "FourthField" }; 

我可以使用類似if (booleanFields.Any(s => inputString.Contains(s)))找出如果字符串中包含任何關鍵字,但什麼是執行替換的最佳方式是什麼?

謝謝。

+0

我認爲你需要提供一個更一般的問題描述。您的問題描述與您感知的實現緊密相關(當您試圖將字段類型從bool更改爲char時,這會讓人感到困惑),我們可能會在更高級別的問題描述中做得更好。 – 2011-05-04 00:45:50

+0

這裏有一個更爲一般的描述 - 我有一個應用程序正在構建一個查詢以傳遞給Web服務,該服務又會查詢數據庫。然而,應用程序將某些字段視爲布爾字段,但在數據庫中它們是'Y'或'N'字符串值。我沒有能力更改應用程序或數據庫,所以需要一些可以將來自應用程序的查詢轉換爲數據庫可以處理的術語。 – 2011-05-04 01:51:27

回答

1

用clipit的話 - 它看起來像你試圖解析SQL,你會喜歡一些幫助嗎?

您可以嘗試,並通過字符串操作做到這一點,但你要遇到的問題 - 想一想,如果你換成「弗雷德」會發生什麼別的東西,也許是:

(it.FirstField = "it.SecondField = True" AND it.SecondField = True) 

我討厭推薦它(因爲它可能相當困難),但正確的做法是解析SQL並操作解析的表達式 - 看看Parsing SQL code in C#看起來像什麼樣的方法可以使這個相對直接。

0

這可能不是最好的答案,因爲兩條非常相似的線(一個爲真/一個爲假),但是這個工程並且對於正則表達式(使用.Dump()準備用於LINQPad粘貼)相當整齊。

但它假設您想要在您的內容中替換每個「.FieldName = True」(這將包括將此格式用引號括起來作爲字符串值的情況)。

void Main() 
{ 
    List<string> booleanFields = new List<string> { "SecondField", "ThirdField", "FourthField" }; 
    string s = @"(it.FirstField = ""fred"" AND it.SecondField = True AND it.ThirdField = False AND it.FifthField = True)"; 

    booleanFields.ForEach(bf => s = Regex.Replace(s, String.Format(@"[.]{0}[ ]*=[ ]*True", bf), String.Format(".{0} = 'Y'", bf))); 
    booleanFields.ForEach(bf => s = Regex.Replace(s, String.Format(@"[.]{0}[ ]*=[ ]*False", bf), String.Format(".{0} = 'N'", bf))); 

    s.Dump(); 
}