Замена символов в строке - PullRequest
       25

Замена символов в строке

0 голосов
/ 23 февраля 2011

Мне нужен рабочий код ASP.NET C # для замены символов в строке.

Мой следующий код работает нормально, но в случае ввода «a» он выводит мне как «678d», но в случае ввода «c» вывод правильный, как и есть, то есть «8d» ... Вот оно автоматически заменяет остальные значения тоже. Я вижу, что код выполняется в пошаговом процессе ... В результате я получаю перегруженный вывод.

{
    StringBuilder builder = new StringBuilder();
    builder.Replace("a", "6b");
    builder.Replace("b", "7c");
    builder.Replace("c", "8d");
    return builder.ToString();
}

Теперь мне нужно заменить «a» на «6b», и он не должен загружать остальные значения.

Ответы [ 5 ]

1 голос
/ 23 февраля 2011

Ваш код переходит от одного оператора к другому - поэтому сначала вы заменяете a на 6b, а затем заменяете b на 6b на 7c и т. Д.

Итак, в вашем конкретном случаеВ этом случае вы можете изменить порядок своих утверждений, чтобы последние не реагировали на более ранние, например

builder.Replace ("c", "8d");

builder.Replace ("b", "7c");

builder.Replace ("a", "6b");

1 голос
/ 23 февраля 2011

Чтобы быть более независимым от фактических замен, вы можете выполнить двустороннюю замену:

Сначала замените вхождения заполнителем, который не появится в строке (например, %% 1 %% для замены "a", %% 2 %% для замены" b "и т. Д.).

Затем во втором прогоне замените %% 1 %% на" 8d ", %% 2 %% на" 7c "и т. Д.

Это будет работать в любом случае.

0 голосов
/ 23 февраля 2011

Вы можете просто использовать пробелы за буквой.Как в «а» с «а» и заменить «а» с обязательным текстом.

0 голосов
/ 23 февраля 2011

Попробуйте это:

Regex rx = new Regex("a|b|c");

string str = "abc";

MatchEvaluator matcher = match => {
    string value = match.Value;
    if (value == "a") {
        return "6b";
    } else if (value == "b") {
        return "7c";
    } else {
        return "8d";
    }
};

var str2 = rx.Replace(str, matcher);

или это, если вы не хотите использовать Regex:

static void Main(string[] args)
{
    var replacements = new[] {
        new Tuple<string, string>("a", "6b"), 
        new Tuple<string, string>("b", "6c"), 
        new Tuple<string, string>("c", "6a")
    };

    string str = "adbc";
    var str2 = MultipleReplace(str, replacements);
}

static string MultipleReplace(string str, IEnumerable<Tuple<string, string>> replacements) {
    StringBuilder str2 = new StringBuilder();

    for (int i = 0; i < str.Length; i++) {
        bool found = false;

        foreach (var rep in replacements) {
            if (str.Length - i >= rep.Item1.Length && str.Substring(i, rep.Item1.Length) == rep.Item1) {
                str2.Append(rep.Item2);
                i += rep.Item1.Length - 1;
                found = true;
                break;
            }
        }

        if (!found) {
            str2.Append(str[i]);
        }
    }

    return str2.ToString();
}
0 голосов
/ 23 февраля 2011

Вам необходимо изменить порядок замен:

StringBuilder builder = new StringBuilder();
builder.Replace("c", "8d");
builder.Replace("b", "7c");
builder.Replace("a", "6b");
return builder.ToString();
...