代码之家  ›  专栏  ›  技术社区  ›  char m

如果不需要替换任何内容,C 35;/.NET 2.0 RegEx.Replace将执行什么操作?

  •  1
  • char m  · 技术社区  · 14 年前

    我有点担心调用RegEx时的性能问题。替换为非常多的字符串,因为我不知道如果没有匹配项它会做什么。

    public static void ReplaceOldWithNew(ref string input)
    {
        string pattern = //something here
        input = Regex.Replace(input, pattern, FormatReplacement);
    }
    
    private string FormatReplacement(Match m)
    {
        return String.Concat("x", formatCount++);
    }
    

    我应该这样吃吗

    public static void ReplaceOldWithNew(ref string input)
    {
        string pattern = //something here
        if (RegEx.IsMatch(input, pattern))
           input = Regex.Replace(input, pattern, FormatReplacement);
    }
    

    问题在于,如果存在匹配项,它将搜索输入字符串两次。是否有任何解决方案只搜索一次匹配项,并仅在需要时生成新的字符串实例。也许用正则表达式。火柴什么的。

    谢谢&BR-马蒂

    2 回复  |  直到 14 年前
        1
  •  3
  •   Ahmad Mageed    14 年前

    如果你检查 Regex.Replace 具有 Reflector

    Match match = regex.Match(input, startat);
    if (!match.Success)
    {
        return input;
    }
    

    换句话说,如果模式不匹配,它将提前退出并返回原始输入。你的 Regex.IsMatch 用法是做双份工作,但它是唯一知道提前是否存在匹配的方法。 正则表达式替换 返回没有指示是否存在匹配的字符串。使用 Match 有环或 Matches 因为您需要找出匹配索引(使用 Index 上的属性 匹配 )把它们拼凑起来。

    如果您希望使用regex alot,可以使用 RegexOptions.Compiled 选择。宣布 Regex

        2
  •  0
  •   CubanX    14 年前

    简单的回答是,创建一个Regex对象,然后当您进行搜索时,您将拥有一个matches集合,您可以在该集合上调用replace。像这样的:

    var regex = new Regex(pattern, RegexOptions.Compiled);
    foreach (var currentMatch in regex.Matches)
    {
        //Do stuff
    }
    

    这样,搜索只完成一次,然后只有在存在匹配项时才能执行操作。