替换字符串中的多个子字符串

时间:2014-01-27 16:38:57

标签: c# string algorithm replace

我需要替换字符串中的几个子串

让我们说:

  • 将原始字符串中的所有A替换为B
  • 将原始字符串中的所有B替换为D

所以例如“AB给BD”

“天真”的方法无法正常运作:

string S="AB";
S=S.Replace("A","B");
S=S.Replace("B","D");

因为它会给DD而不是BD。 (第一个A改为B但后来不必要地改为D)

如何处理此类案件?使用任何大小的子串进行这样的单独替换是否有意义?

编辑:我给了一些不是现实生活的例子,实际上它可以按相反的顺序进行(首先是B到D,然后是A到B)但是正如其他人注意到的那样我感兴趣更一般的解决方案:任何char替换列表和任何单词替换列表

对于字符,我想现在一个好的方法就是遍历字符串中的所有字符并构建一个新的字符串,在必要时进行替换。

对于单词,我认为这可能更难,如果一个被替换的单词是另一个单词的一部分怎么办?

例如

string S="man superman woman superwoman"

我想将“男人”替换为“男孩”,将“女人”替换为“女孩”仅作为单个单词

5 个答案:

答案 0 :(得分:5)

假设没有周期,你需要反过来做。 含义:

string S="AB";
S=S.Replace("B","D");
S=S.Replace("A","B");

这样,B切换到D,然后A切换到B,您没有任何不必要的更改。

正如Niklas B.正确地指出的那样,在一般子串的情况下,可能采取不同的方式。

我将迭代字符串,存储任何子字符串出现的索引。完成后,我将继续执行实际切换。这样您就无法“完成”您所做的更改。

答案 1 :(得分:3)

一种简单的方法是简单地循环遍历字符串,然后使用if-else或switch语句测试字符并相应地更改它们。

这样字符只会改变一次。

var testString = "Hello World";
var newString = new StringBuilder();

foreach (char c in testString)
{
    switch (c)
    {
        case 'e':
            newString.Append('l');
            break;
        case 'l':
            newString.Append('e');
            break;
        default:
            newString.Append(c);
            break;
    }
}

// testString will be "Hleeo Wored"
testString = newString.ToString();

答案 2 :(得分:2)

您可以先用一个肯定不会在源字符串中出现的标记替换“A”。

例如:

S=S.Replace("A","#");
S=S.Replace("B","D");
S=S.Replace("#","B");

答案 3 :(得分:0)

使用Regex.Replace

与下面的代码一样,您可以将要替换的字符串映射到替换字符串。 这更干净,有些 - 更具可读性

IDictionary<string,string> map = new Dictionary<string,string>()
        {
           {"A","B"},
           {"B","D"},
        };
var regex = new Regex(String.Join("|",map.Keys));
var newStr = regex.Replace(str, m => map[m.Value]);

答案 4 :(得分:-1)

只需更改代码行的顺序:

string S="AB";
S=S.Replace("B","D");
S=S.Replace("A","B");