在C#中解析一个字符串并替换内容

时间:2011-05-04 00:36:16

标签: c# string c#-4.0

我有一个字符串,需要根据字符串中出现的某些子字符串替换一些内容。例如示例字符串可能是

(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)

即。如果子字符串出现在字符串中,我想将True更改为'Y',将False更改为'N',但保留其他任何True / False值。

我有一系列要查找的子字符串:

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

我可以使用类似if (booleanFields.Any(s => inputString.Contains(s)))的内容来查明字符串是否包含任何关键字,但执行替换的最佳方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

用clipit的话来说 - 看起来你正在尝试解析SQL,你想要一些帮助吗?

你可以尝试通过字符串操作来做到这一点,但是你会遇到问题 - 想想如果用其他东西替换“fred”会发生什么,或许:

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

我厌恶推荐它(因为它可能非常困难),但正确的方法是解析SQL并操纵解析的表达式 - 请参阅Parsing SQL code in C#看起来像是一种可能的方法使这个相对平坦。

答案 1 :(得分:0)

由于两个非常相似的行(一个用于true /一个用于false),这可能不是最好的答案,但这对于正则表达式来说是相当简洁的(使用.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();
}