替换字符串中的字符列表,不要覆盖替换的字符

时间:2011-09-15 09:44:24

标签: c# encryption replace

我正在为这个解密程序工作,这是我的一个爱好:geocaching。

想法

我有一个字符列表:

[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9]

在Windows窗体中,您可以指定每个字符应替换的字符。

[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,9,8,7,6,5,4,3,2,1,0]

所以这会导致我的字符串解密被转换为大写。

示例:the quick brown fox jumps over the lazy dog会产生THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG

我是如何解决的

public static string DecodeWithKey(string source, string keyBase, string keyValue)
{
    StringBuilder sb = new StringBuilder(source);
    for (int i = 0; i < keyBase.Length; i++)
    {
        sb = sb.Replace(keyBase[i], keyValue[i]);
    }
    return sb.ToString();
}

现在这适用于上面的示例。但是当你开始移动角色时,它完全失败了。

问题在于事物的顺序

所以,让我们说这是我的基础:

[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9]

现在我正在使用一些更现实的值来替换:

[a,b,c,d,t,f,g,h,i,j,k,l,m,n,o,p,q,r,s,p,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9]

注意,我用t和t改变了e。

结果:the quick brown fox jumps over the lazy dog变为php quick brown fox jumps ovpr php lazy dog

正如您在the中看到的那样,它将其替换为tht,然后再替换为php。从我的逻辑中可以看出这一点。

我该怎样防止这种情况?因此显示pht并且不会两次替换字符。

我希望我已经清楚地解释过了。

2 个答案:

答案 0 :(得分:3)

为什么不简单地逐个字符地构建解码后的字符串,而不是就地修改源代码的副本?

首先,构建一个字典,将每个编码字符与其解码值匹配

public static string DecodeWithKey(string source, Dictionary<char,char> decoder) 
{ 
    StringBuilder sb = new StringBuilder(source.Length); 
    for (int i = 0; i < source.Length; i++) 
    { 
        sb.Append( decoder[source[i]] ); // error management left out as an exercice
    } 
    return sb.ToString(); 
}

在回应Piotr评论时,让我们尝试将一些LINQ投入游戏:

public static string DecodeWithKey(string source, Dictionary<char,char> decoder) 
{ 
    return String.Concat(from ch in source select decoder[ch]);
}

答案 1 :(得分:1)

您可以使用正则表达式替换来执行您想要的操作。看看this question

将替换项转换为字典,然后:

var regex = new Regex(String.Join("|",map.Keys));
var newStr = regex.Replace(str, m => map[m.Value]);