1

我有一个Regex.Replace Method (String, String, MatchEvaluator)文档),我正在使用它MatchEvaluator必须做一些相当繁重的工作。正在使用StandardInputStandardOutput重定向对另一个库进行调用。该库的性质是,我必须打开 aStandardInput然后关闭它才能通过StandardOutput. 不用说,这是一个相当密集的过程。

但是,我的系统上确实有更多线程,并且想知道是否有办法让Regex线程以并行方式运行。我似乎找不到任何允许这样做的重载,而且鉴于Regex. 我曾考虑过人为地断开字符串,但我担心这会导致某个位置出现中断,从而导致正则表达式的处理发生变化,因为它确实使用了一些环视(虽然不多)。

任何人都可以阐明我如何能够并行化这个吗?它是一个非常大的文档,其中包含多个(数百个)需要替换的匹配项。结果是一个文档,其中所有匹配的字符串都被MatchEvaluator函数的输出替换。

样本文件:

Random characters from all over the alphabet that have no use to me in this context. Including =, &, ", ', &, etc. [StringToReplace] More stuff I can ignore. [OtherStringToReplace]. More characters including foreign languages.

我正在使用以下内容Regex

resultText = Regex.Replace(text, "(?<=\])[^\[\]]+(?=\[)", matchEval)
4

1 回答 1

4

假设我想从此输入中获取单词并对它们中的每一个进行昂贵的操作,例如转换为大写 :)

string input = @"abc 123 def 456 ghi 789 jkl mno pqr";
string pattern = @"[a-z]+";

我会做的是:

1- 获取所有匹配项

var matches = Regex.Matches(input,pattern).Cast<Match>().Select(m=>m.Value);

2- 对所有匹配(并行)执行代价高昂的操作并将结果存储在字典中

var dict = new ConcurrentDictionary<string, string>();
Parallel.ForEach(matches, m =>
{
    Thread.Sleep(1000); // <--Time consuming OP.
    dict[m] = m.ToUpper();
});

3-使用字典进行替换

var output = Regex.Replace(input, pattern, m => dict[m.Value]);
于 2013-08-20T20:48:50.750 回答