在C#中清除Regex缓存

时间:2018-03-23 06:56:27

标签: c# .net regex

我正在使用正则表达式方法Regex.Replace来表示大字符串。由于这些字符串被缓存,因此占用大量内存。

我希望在完成微粒操作后清除这些Regex缓存,以便对字符串进行垃圾回收。

我可以使用Regex.CacheSize属性设置Regex缓存大小,但是如何保持缓存大小并清除缓存?将缓存大小设置为零会影响性能,因为我对同一个字符串多次使用此方法。

如果我将缓存大小设置为零并将其重置为旧值,是否会丢弃缓存的对象并收集垃圾?

代码:

// languageDetails is a xml string holding, xml comments, name space etc. 
// Need to remove the comments.

string pattern = "(<!--.*?-->)";

string languageDetails = Regex.Replace(
  languageDetails, 
  pattern, 
  string.Empty, 
  RegexOptions.Singleline);

2 个答案:

答案 0 :(得分:0)

查看源代码:

public static int CacheSize
{
    [__DynamicallyInvokable] get
    {
        return Regex.cacheSize;
    }

    [__DynamicallyInvokable] set
    {
        if (value < 0)
            throw new ArgumentOutOfRangeException(nameof (value));
        Regex.cacheSize = value;
        if (Regex.livecode.Count <= Regex.cacheSize)
            return;
        lock (Regex.livecode)
        {
            while (Regex.livecode.Count > Regex.cacheSize)
                Regex.livecode.RemoveLast();
        }
    }
}

如您所见,将值设置为0将调用Regex.livecode.RemoveLast();

因此,它将清除livecode列表。

答案 1 :(得分:0)

  

...对于大字符串。由于这些字符串被缓存,因此占用大量内存。

输入/输出字符串不以任何方式缓存。

缓存存储已编译的正则表达式。因此,除非你有很多非常大的模式,否则你的内存问题不是由缓存引起的。