代码之家  ›  专栏  ›  技术社区  ›  David Murdoch

什么是与Java的AppDebug和AppEntT尾等价的C?

  •  5
  • David Murdoch  · 技术社区  · 14 年前

    更新

    这是我想出来的。我还没有测试它,因为它是更大代码的一部分,仍然需要移植。

    你能看到任何不合适的东西吗?

    private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%";
    string html = "some html";
    int p = 0;
    var userBlock = new ArrayList();
    
    MatchCollection matcher = preservePatterns[p].Matches(html);
    int index = 0;
    StringBuilder sb = new StringBuilder();
    int lastValue = 0;
    
    foreach(Match match in matcher){
        string matchValue = match.Groups[0].Value;
    
        if(matchValue.Trim().Length > 0) {
            userBlock.Add(matchValue);
    
            int curIndex = lastValue + match.Index;
            sb.Append(html.Substring(lastValue, curIndex));
            sb.AppendFormat(tempUserBlock, p, index++);
    
            lastValue = curIndex + match.Length;
        }
    }
    
    sb.Append(html.Substring(lastValue));
    html = sb.ToString();
    

    以下原始邮件:

    这里是原始Java:

    private static final String tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%";
    String html = "some html";
    int p = 0;
    List<String> userBlock = new ArrayList<String>();
    
    Matcher matcher = patternToMatch.matcher(html);
    int index = 0;
    StringBuffer sb = new StringBuffer();
    while (matcher.find())
    {
        if (matcher.group(0).trim().length() > 0)
        {
            userBlock.add(matcher.group(0));
            matcher.appendReplacement(sb, MessageFormat.format(tempUserBlock, p, index++));
        }
    }
    matcher.appendTail(sb);
    html = sb.toString();
    

    到目前为止我的C转换

    private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%";
    string html = "some html";
    int p = 0;
    var userBlock = new ArrayList();
    
    MatchCollection matcher = preservePattern.Matches(html);
    int index = 0;
    StringBuilder sb = new StringBuilder();
    
    for(var i = 0; i < matcher.Count; ++i){
        string match = matcher[i].Groups[0].Value;
        if(match.Trim().Length > 0) {
            userBlock.Add(match);
            // WHAT DO I DO HERE?
            sb.Append( string.Format(tempUserBlock, p, index++) );            
        }
    }
    // WHAT DO I DO HERE?
    matcher.appendTail(sb);
    html = sb.toString();
    

    参见上面的评论,我在这里问,“我在这里做什么?”

    澄清
    上面的Java代码正在执行一些HTML上的字符串替换。它保存最初替换的文本,因为在完成某些空白压缩后,需要稍后重新插入。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Alan Moore Chris Ballance    14 年前

    没有必要复制Java的 appendReplacement/appendTail .NET有更好的功能: MatchEvaluator . 过来看:

    string holder = "Element {0} = {1}";
    string s0 = "111 222 XYZ";
    ArrayList arr = new ArrayList();
    
    string s1 = Regex.Replace(s0, @"\d+",
      m => string.Format(holder, arr.Add(m.Value), m.Value)
    );
    
    Console.WriteLine(s1);
    foreach (string s in arr)
    {
      Console.WriteLine(s);
    }
    

    输出:

    Element 0 = 111 Element 1 = 222 XYZ
    111
    222
    

    实现MatchEvaluator有几种方法,在 this article . 这个(lambda表达式)是迄今为止最酷的。

        2
  •  2
  •   Pure.Krome    14 年前

    我不熟悉Java正则表达式类,但这是我对代码所做的解释:

    private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
    string html = "some html"; 
    int p = 0; 
    var userBlock = new List<string>(); 
    
    MatchCollection matcher = preservePattern.Matches(html); 
    StringBuilder sb = new StringBuilder(); 
    int last = 0;
    foreach (Match m in matcher)
    {
        string match = m.Groups[0].Value; 
        if(match.Trim().Length > 0) { 
            userBlock.Add(match); 
            sb.Append(html.Substring(last, m.Index - last));
            sb.Append(m.Result(string.Format(tempUserBlock, p, index++)));
        }
        last = m.Index + m.Length;
    }
    sb.Append(html.Substring(last));
    html = sb.ToString();