【问题标题】:Replacing two characters with each other in a string, without using placeholder characters将字符串中的两个字符相互替换,而不使用占位符
【发布时间】:2009-10-30 19:05:01
【问题描述】:

我有这个字符串

aabqqidjwljdpfjem

我需要将 b 替换为 p 并将 p 替换为 b

aapqqidjwljdbfjem

我这样做的方式看起来像这个

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

这真的很丑

有没有更好的方法?

编辑

为什么丑?因为我必须决定/找到适用于任何可能情况的任意字符集

【问题讨论】:

  • 请在此上下文中定义“更好”。有很多方法,但存在各种问题,例如内存使用、性能等。您认为更好的方法是什么?
  • 我不觉得这太丑了。
  • 这很流畅!流利?这!是!不可变!

标签: .net regex linq


【解决方案1】:
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】:

    我认为应该这样做,我认为它更具可读性

          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;
      }
    

    虽然开放封闭原则并没有赢得任何奖品!

    【讨论】:

    • 不错的方法,但我会使用 StringBuilder 而不仅仅是字符串。
    • 是的,我应该使用 stringbuilder
    【解决方案3】:

    这似乎也有效

    var a = "aa**b**qqidjwljd**p**fjem";
    a = new string((from n in a select (n == 'b' ? 'p' : (n == 'p' ? 'b' : n))).ToArray());
    

    【讨论】:

      【解决方案4】:

      我暂时想不出更好的方法,真的你的方法没那么难看。

      假设字符串中从来没有 1,它应该可以正常工作。

      【讨论】:

        【解决方案5】:

        不。这与标准交换变量问题相同。 (为了交换A和B的值,你需要使用C)。

        【讨论】:

        • 如果您想交换周围的 2 个字符,您仍然必须将其更改为中介。你不能做 .Replace('B', 'P').Replace('P', 'B') 因为你会得到所有的 B。所以即使使用正则表达式,它仍然是一样的。
        • 谢谢。不确定 Regex 是否执行所有操作或链接。如果您使用捕获,我会假设它已经到位。
        • 或者你可以看看内斯特的回答,把它作为一组来做......:stackoverflow.com/questions/1651729/a-replace-question/…
        【解决方案6】:

        周五下午,我能想到的就是你的简明扼要。根据 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);
        

        【讨论】:

          【解决方案7】:

          你的方法很好。唯一的问题是字符串中是否有“1”,因为它会导致您的逻辑被破坏。

          更好的解决方案是使用您确定永远不会出现在文本中的临时字符,例如竖线 ('|') 或波浪号 ('~')。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-09
            • 2021-09-26
            • 1970-01-01
            相关资源
            最近更新 更多