增强的字符串处理 II
克服限制:增强的字符串处理。
引言
在我之前的文章增强的字符串处理, EnhancedStringHandling.aspx 中,我以一个章节结束了这篇文章:我们从这里走向何方,在那里我指出了一个限制:“现在的规范不允许分隔符作为值的一部分。所以例如:{identifier::value 包含一个左或右大括号}将无法通过大括号匹配检查。这不仅仅是理论上的兴趣。例如,如果我们想编写一个{Decrypt::encrypted value} 解密构造——如果我们不能保证加密的值既没有左大括号也没有右大括号,那么我们就不能编写这样一个ProcessDecrypt
类。这个问题不一定局限于单字符分隔符的情况,因为多字符分隔符会被转换成单字符分隔符。”
在我发表这篇文章几天后,我突然意识到这个限制仅仅存在于我的脑海中。
感知到的问题
当我们尝试编写一个正则表达式来匹配以下形式:{Crypt::encrypted-text} 时,如果 encrypted-text 包含一个左分隔符(“{”)、一个右分隔符(“}”)或一个分隔符字符串(“::”),我们就会遇到麻烦。因此,我过早地得出结论,我们需要更强大的机制来处理这种情况。
修复限制
到目前为止,在整个文章增强的字符串处理中,我们通过用一个新的 string
替换有问题的 string
来处理这类问题。 在这种情况下,我们可以使用相同的技术,通过将加密文本作为转换为 string
的 Unicode 数字来提供。
所以,如果要加密 string
:“01234 -- The quick brown fox jumped over the lazy dogs -- 56789!”,我们将首先将其加密成一个 string
或字符。但是,我们不会像以前那样将加密字符包含在 string
中(在 {Crypt::encrypted string} 构造中),而是将加密 string
的 Unicode 字符表示(用逗号分隔)包含进来。所以 string
“01234 -- The quick brown fox jumped over the lazy dogs -- 56789!”
encrypted 将表示为
“225,14,132,43,189,68,220,227,84,28,69,216,140,97,101,85,254,11,229,238,
148,191,73,177,235,233,193,176,45,187,218,44,92,107,175,168,56,90,14,24,201,219,
251,161,82,146,221,133,249,49,111,196,239,55,164,209,93,126,144,158,212,39,101,2
9,197,221,62,174,210,137,124,134”
因此,ProcessCrypt()
将处理一个表示上述 string
(已加密)的构造,如下所示:{Crypt::225,14,132,..}。因此,我们解决了加密 string
中可能包含任何字符(包括分隔符或分隔符)的问题。请参见 CypherTest()
、TestMethod
。(ProcessCrypt()
中的示例代码并非旨在成为最安全的加密/解密代码,它旨在说明这一点——我们可以克服要处理的 string
值中的分隔符或分隔符。)
[TestMethod]
public void CypherTest()
{
string org = "01234 -- The quick brown fox jumped over the lazy dogs -- 56789!";
string encripted = string.Format("Text: {{Crypt::{0}}}",
ProcessCrypt.Encrypt(org));
var context = new List<IProcessEvaluate>();
context.Add(new ProcessCrypt());
var eval = new EnhancedStringEval(context);
string decript = eval.EvaluateString(encripted);
Assert.AreEqual("Text: " + org, decript);
}
虽然 ProcessCrypt
如下所示
public sealed class ProcessCrypt : IProcessEvaluate
{
static ProcessCrypt()
{
var reo = RegexOptions.Singleline | RegexOptions.IgnoreCase;
_reCrypt = new Regex(@"{\s*Crypt\s*::(?<cipher>[0-9,]*)}", reo);
}
public ProcessCrypt() { }
#region IProcessEvaluate Members
/// <summary>
///
/// </summary>
/// <param name="src"></param>
/// <param name="ea"></param>
public void Evaluate(object src, EnhancedStringEventArgs ea)
{
// Task 1:
string encrypted = ea.EhancedPairElem.Value;
// ea.IsHandled == false, by default.
Match m = _reCrypt.Match(encrypted);
if (!m.Success) return;
string deciphered = _reCrypt.Replace(encrypted, CipherReplace);
if (deciphered == encrypted) return;
// Task 2
ea.IsHandled = true;
// Task 3
ea.EhancedPairElem.Value = deciphered;
}
#endregion
/// <summary>
///
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private string CipherReplace(Match m)
{
string encrypted = m.Groups["cipher"].Value;
return Decrypt(encrypted);
}
private const string _criptSplitter = ",";
private static Regex _reCrypt;
...
}
尽情享用!
Avi
历史
- 2010 年 12 月 15 日:首次发布