小编WSk*_*kid的帖子

C#多个正则表达式替换字符串 - 太多内存

基本上我想要做的是运行多个什么(15-25)正则表达式替换上一个字符串尽可能最好的内存管理.

概述:通过ftp附加到StringBuilder一个非常大的字符串来传输一个纯文本文件(有时是html).文件大小范围从300KB到30MB.

正则表达式是半复杂的,但需要文件的多行(例如,识别书的部分),因此任意破坏字符串,或者在每个下载循环上运行替换都是不可能的.

替换样本:

Regex re = new Regex("<A.*?>Table of Contents</A>", RegexOptions.IgnoreCase);
source = re.Replace(source, "");
Run Code Online (Sandbox Code Playgroud)

每次运行更换内存天空火箭,我知道这是因为字符串在C#中是不可变的,它需要复制 - 即使我称GC.Collect()它仍然对30MB文件没有帮助.

有关更好的方法的建议,或使用常量内存执行多个正则表达式的方法替换(制作2个副本(内存为60MB),执行搜索,丢弃复制回30MB)?

更新:

似乎没有一个简单的答案,但对于未来的人来说,我最终使用下面所有答案的组合使其达到可接受的状态:

  1. 如果可能的话,将字符串拆分成块,请参阅manojlds的答案,以便在读取文件时找到合适的终点.

  2. 如果你不能像流一样进行拆分,至少可以在以后拆分 - 请参阅ChrisWue的一些外部工具的答案,这些工具可能有助于这个流程管道到文件.

  3. 优化正则表达式,避免贪婪的运算符,并尽可能地限制引擎必须做的事情 - 请参阅Sylverdrag的回答.

  4. 尽可能结合正则表达式,这减少了正则表达式不相互依赖时的替换次数(在这种情况下用于清除错误输入) - 请参阅Brian Reichle对代码示例的回答.

谢谢你们!

c# regex string memory-management

8
推荐指数
1
解决办法
2761
查看次数

获取两个元素之间的所有html

问题:
提取两个标题之间的所有 html,包括标题 html。标题文本是已知的,但不知道格式、标签名称等。它们不在同一个父级中,并且可能(嗯,几乎可以肯定)在它自己的子级中有子子级)。

澄清一下:标头可以在<h1>or<div>或任何其他标签内。它们也可以被包围<b><i><font>或者更多<div>的标签。关键是:元素中唯一的文本是标题文本。

我可用的工具是:使用 WebBrowser 控件的 C# 3.0 或 Jquery/Js。

我采用了 Jquery 路线,遍历了 DOM,但我遇到了儿童问题并适当地添加了它们。这是到目前为止的代码:

function getAllBetween(firstEl,lastEl) {
    var collection = new Array(); // Collection of Elements
    var fefound =false;
    $('body').find('*').each(function(){
        var curEl = $(this);
        if($(curEl).text() == firstEl) 
            fefound=true;
        if($(curEl).text() == lastEl) 
            return false;

        // need something to add children children
        // otherwise we get <table></table><tbody></tbody><tr></tr> etc
        if (fefound)
            collection.push(curEl);
    });
    var div = document.createElement("DIV");
    for (var …
Run Code Online (Sandbox Code Playgroud)

javascript jquery c#-3.0

5
推荐指数
1
解决办法
1905
查看次数

从子窗口调用父窗口中的函数

我正在尝试在WPF程序中实现自定义搜索对话框.Parent窗口是绑定到Observable Collection的ListView.

我用搜索表单创建了一个新窗口,它被初始化为:

searchForm sf = new searchForm(_QPCollection);
sf.Owner = this;
sf.Show();
Run Code Online (Sandbox Code Playgroud)

我有这个函数我试图调用(在所有者窗口中):

public void selectIndex(int index)
{
    ListViewItem toSelect = listView1.Items[index] as ListViewItem;
    toSelect.Focus();
}
Run Code Online (Sandbox Code Playgroud)

然后在子窗口(searchForm)中尝试调用selectIndex,如下所示:

public void SearchJob_Click(object sender, RoutedEventArgs e)
{
    if (sJob.Text == "" || sJob.Text == null) { return; }
    for (int i = findCount; i < _QPCollectionSearch.Count; i++)
    {
        if (i == _QPCollectionSearch.Count - 1) { i = 0; }
        if (_QPCollectionSearch[i].jobNumAndFlow.IndexOf(sJob.Text) > -1)
        {
            findCount = i;
            Owner.selectIndex(i);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:System.Windows.Window不包含"selectIndex"的定义.

这 …

c# wpf

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

c# ×2

c#-3.0 ×1

javascript ×1

jquery ×1

memory-management ×1

regex ×1

string ×1

wpf ×1