Regex MatchEvaluator并行

时间:2013-08-20 18:41:00

标签: .net regex parallel-processing stdout stdin

我有一个Regex.Replace Method (String, String, MatchEvaluator)documentation)我正在使用的MatchEvaluator必须做一些相当繁重的工作。正在使用StandardInputStandardOutput重定向调用另一个库。该库的性质是这样的,我必须打开StandardInput,然后关闭它以通过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)

1 个答案:

答案 0 :(得分:3)

假设我想从这个输入中获取单词并对每个单词执行代价高昂的操作,比如转换为大写:)

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]);