在字符串中相互替换两个字符,而不使用占位符字符

时间:2009-10-30 19:05:02

标签: .net regex linq

我有这个字符串

  

AA的 B'/强> qqidjwljd的 P fjem

我需要将 b 替换为 b ,将 b 替换为 b

  

AA的 P qqidjwljd的 B'/强> fjem

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

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

这真是太丑了

有更好的方法吗?

修改

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

7 个答案:

答案 0 :(得分:7)

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!");
});

答案 1 :(得分: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;
  }

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

答案 2 :(得分:1)

这似乎也有用

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

答案 3 :(得分:0)

我现在想不出更好的方法,你的方法真的不那么难看。

假设字符串中从不存在1,它应该可以正常工作。

答案 4 :(得分:0)

不。它与标准交换变量问题相同。 (为了交换AB的值,您需要使用C)。

答案 5 :(得分:0)

在周五下午我的想法很简洁。根据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);

答案 6 :(得分:0)

你的方式很好。唯一的问题是如果字符串中有一个'1',因为它会导致你的逻辑被破坏。

更好的解决方案是使用您确定永远不会出现在文本中的临时字符,例如管道(“|”)或代字号(“〜”)。