我正在为这个解密程序工作,这是我的一个爱好: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
并且不会两次替换字符。
我希望我已经清楚地解释过了。
答案 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]);