将单词(不区分大小写)与列表匹配,并将其替换为列表中的单词-C#Regex

将单词(不区分大小写)与列表匹配,并将其替换为列表中的单词-C#Regex,c#,regex,C#,Regex,假设我的字符串是“这是一个字符串” 我的列表是{“tHis”,“WoRd”,“a”,“is”} 我的正则表达式是{“tHis”|“WoRd”|“a”|“is”} 所需的结果是“这是一个字符串” 我唯一的想法是在整个列表上循环,并针对一个子字符串逐个测试它快速而肮脏的解决方案: var dict = words.ToDictionary(x => x, StringComparer.CurrentCultureIgnoreCase); str = Regex.Replace(str, @"

假设我的字符串是
“这是一个字符串”

我的列表是
{“tHis”,“WoRd”,“a”,“is”}

我的正则表达式是
{“tHis”|“WoRd”|“a”|“is”}


所需的结果是“这是一个字符串”

我唯一的想法是在整个列表上循环,并针对一个子字符串逐个测试它

快速而肮脏的解决方案:

var dict = words.ToDictionary(x => x, StringComparer.CurrentCultureIgnoreCase);

str = Regex.Replace(str, @"\b.+?\b", x =>
{
    string replace;
    dict.TryGetValue(x.Value, out replace);
    return replace ?? x.Value;
});
请注意,正则表达式模式是次优模式,仅当单词仅由字母和数字组成时才起作用。
dict
可以重用(因此您应该将其缓存)。我使用的是类似于……的哈希表,因此您可以更快地检索@grek40对输入单词建议的替换。

string input=”这是一个字符串“;
    string input = "this is a string";
    List<string> words = new List<string>(new[] { "tHis", "WoRd", "a", "iS" });
    string pattern = "\\b(" + string.Join("|", words) + ")\\b";
    Regex reg = new Regex(pattern, RegexOptions.IgnoreCase);
    string output = reg.Replace(input, x => words.FirstOrDefault(w => w.Equals(x.Value, StringComparison.CurrentCultureIgnoreCase)));
列表词=新列表(新[]{“tHis”、“WoRd”、“a”、“iS”}); 字符串模式=“\\b”(“+string.Join”(|“,words)+”\\b”; Regex reg=new Regex(模式,RegexOptions.IgnoreCase); 字符串输出=reg.Replace(输入,x=>words.FirstOrDefault(w=>w.Equals(x.Value,StringComparison.CurrentCultureIgnoreCase));
它们是没有空格的单词吗?只有字母吗?基本上,你不能不将每个单词与列表进行比较……你只能将列表变成更好的可搜索数据结构,如前缀树或哈希表,这样你就可以更快地检索输入单词的替换项e'-'、'和'~'