Замена двух символов друг на друга в строке без использования символов-заполнителей - PullRequest
1 голос
/ 30 октября 2009

У меня есть эта строка

аа B qqidjwljd р fjem

Мне нужно заменить b на p и p на b

аа * * 1 022 * р * qqidjwljd тысяча двадцать три B fjem

как я это делаю похоже на это

myvar.replace("b","1").replace("p","b").replace("1","p")

это действительно ужасно

есть ли лучший способ?

редактировать

почему уродливый? потому что я должен решить / найти произвольный набор символов, который будет работать для любого возможного случая

Ответы [ 7 ]

7 голосов
/ 30 октября 2009
string sold = "aa**b**qqidjwljd**p**fjem";
string snew = Regex.Replace(sold, "(?<replace>b|p)", delegate(Match p)
{
    switch (p.Groups["replace"].Value)
    {
        case "b": return "p";
        case "p": return "b";
    };
    throw new ApplicationException("Should never happen!");
});
2 голосов
/ 30 октября 2009

Я думаю, что это должно сделать это, я думаю, что это намного более читабельно

      private static string Transpose(string s)
  {
     string output = "";
     foreach (char c in s)
     {

        switch (c)
        {
           case 'P':
              output += 'B';
              break;
           case 'B':
              output += 'P';
              break;
           default:
              output += c;
              break;
        }
     }
     return output;
  }

не выигрывает призы по принципу открытого закрытого типа!

1 голос
/ 30 октября 2009

это тоже похоже на работу

var a = "aa**b**qqidjwljd**p**fjem";
a = new string((from n in a select (n == 'b' ? 'p' : (n == 'p' ? 'b' : n))).ToArray());
0 голосов
/ 30 октября 2009

Ваш путь работает нормально. Единственная проблема заключается в том, что если в строке есть «1», это может привести к повреждению вашей логики.

Лучшим решением было бы использование временного символа, который, как вы уверены, никогда не появится в тексте, например, например, труба ('|') или тильда ('~').

0 голосов
/ 30 октября 2009

Ваш так кратко, как я могу думать в пятницу днем. В зависимости от того, что Replace делает внутри, это может быть быстрее:

    char [] myChars = "aa**b**qqidjwljd**p**fjem".ToCharArray();

    for (int x = 0; x < myChars.Length; x++)
    {
        char currentCharacter = myChars[x];
        if (currentCharacter == 'b')
        {
            myChars[x] = 'p';
        }
        else if (currentCharacter == 'p')
        {
            myChars[x] = 'b';
        }
    }

    string myString = new string(myChars);
0 голосов
/ 30 октября 2009

Неа. Это то же самое, что и стандартная проблема подстановки переменных. (Чтобы поменять местами значения A и B, необходимо использовать C).

0 голосов
/ 30 октября 2009

Я не могу придумать лучшего способа в данный момент, на самом деле ваш метод не так уж уродлив.

Предполагая, что в строке никогда не бывает 1, все должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...