C#字符串替换为dictionary和Regex条件



我想用我拥有的字典替换字符串的值,但前提是它们符合正则表达式条件。

这就是我所拥有的:

string input = @"A.4 AND ([10] A.4 OR A.4) OR [10]A.4 A.5 [10]A.5";
Dictionary <string, string> dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) {
{"A.4", "Test"},
{"A.5", "Test2"},
};
var output = dict.Aggregate(input, (current, value) => current.Replace(value.Key, value.Value));
//current output = "Test AND ([10] Test OR Test) OR [10]Test Test2 [10]Test2"
//wished output = "Test AND ([10] A.4 OR Test) OR [10]A.4 Test2 [10]A.5"

当文本前面有"[10]""[10] "时,我不想替换文本。我认为我应该使用正则表达式或类似的东西,但我不知道如何使用。

您可以使用regex执行替换操作:

var output = dict.Aggregate(input, (current, sub) => Regex.Replace(current, $@"(?<![10]s?){Regex.Escape(sub.Key)}", sub.Value));

否定的后备断言(?<![10]s?)将确保匹配项永远不会跟随在[10][10]之后。


Panagiotis Kanavos指出,通过将执行字典查找的委托传递给Regex.Replace:,您可以完全跳过Aggregate调用

var replacePattern = $@"(?<![10]s?)(?:{string.Join('|', dict.Keys.Select(Regex.Escape))})";
var output = Regex.Replace(input, replacePattern, (m) =>  dict[m.Value]);

Regex。Replace具有一个重载,其中包含一个创建替换值的委托。如果标记具有模式,则可以使用单个正则表达式来匹配它们,并使用字典值替换它们。

此正则表达式匹配形式为A.n的标记,其中n是一个数字:

var regex=new Regex(@"(?<![10]s?)A.d+");
var output=regex.Replace(input,match=>dict[match.Value]);
Console.WriteLine(output);

这会产生

Test AND ([10] A.4 OR Test) OR [10]A.4 Test2 [10]A.5

CCD_ 10是一个负的后备模式。它匹配以否定模式开头的字符串。(?<![10]s?)匹配不以[10]和可选空格开头的字符串。

最新更新