Разобрать строку в C # и заменить содержимое - PullRequest
1 голос
/ 04 мая 2011

У меня есть строка, и мне нужно заменить некоторое содержимое на основе определенных подстрок, появляющихся в строке.например, пример строки может быть

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

1 голос
/ 04 мая 2011

В словах clipit - похоже, вы пытаетесь разобрать SQL, вам нужна помощь с этим?

Вы можете попытаться сделать это с помощью манипуляции со строками, но вы столкнетесь спроблемы - подумайте о том, что произойдет, если вы замените «Фред» на что-то еще, возможно:

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

Я не хочу рекомендовать это (потому что это, вероятно, довольно сложно), но правильный способ сделать эточтобы разобрать SQL и манипулировать разобранным выражением - см. Синтаксический анализ кода SQL в C # , чтобы узнать, как выглядит подход, который может сделать это относительно простым.

0 голосов
/ 04 мая 2011

Вероятно, это не лучший ответ из-за двух очень похожих строк (одна для true / одна для false), но это работает и довольно аккуратно для Regex (с .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();
}
...