我有一个Regex.Replace Method (String, String, MatchEvaluator)
(documentation)我正在使用的MatchEvaluator
必须做一些相当繁重的工作。正在使用StandardInput
和StandardOutput
重定向调用另一个库。该库的性质是这样的,我必须打开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)
答案 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]);