65.9K
CodeProject 正在变化。 阅读更多。
Home

增强的字符串处理 II

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.76/5 (11投票s)

2010年12月16日

CPOL

2分钟阅读

viewsIcon

40728

downloadIcon

231

克服限制:增强的字符串处理。

引言

在我之前的文章增强的字符串处理, 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 日:首次发布
© . All rights reserved.