2011-05-04 102 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(); 
}