我很困惑为什么这行是我的代码没有对输入的字符串做任何事情。
result = Regex.Replace(astring, @"\b"+Regex.Escape(words[i])+@"\b", "", RegexOptions.IgnoreCase);
所以基本上我有一个方法,它接受一个字符串,如果它在禁止的单词数组中,将用空字符串替换字符串中的单词。我也试过了。
result = Regex.Replace(astring, @"\b"+words[i]+@"\b", "", RegexOptions.IgnoreCase);
我的数组或其他任何东西都没有错,因为没有使用正则表达式它将替换子字符串,但我需要它来匹配和替换整个单词,这就是为什么我使用正则表达式。
请帮忙!
答案 0 :(得分:1)
很难看出你在这做什么。然而
var astring = "bob dog cat brown cow";
var list = new List<string>{"dog", "brown"};
var escapedList = list.Select(word => Regex.Escape(word)).ToList();
// i guess this is what you are trying to do
foreach (var word in escapedList)
{
var result = Regex.Replace(astring, @"\b" + Regex.Escape(word) + @"\b", "xxx", RegexOptions.IgnoreCase);
Console.WriteLine(result);
}
Console.WriteLine();
// i'm guessing this is more what you want
var result2 = Regex.Replace(astring, $@"\b{string.Join(@"\b|\b", escapedList)}\b", "xxx", RegexOptions.IgnoreCase);
Console.WriteLine(result2);
<强>输出强>
bob xxx cat brown cow
bob dog cat xxx cow
bob xxx cat xxx cow
答案 1 :(得分:0)
在i
中使用索引words[i]
表示您在循环中调用它。但是,在这种情况下,您只保留最后一次替换的结果,因为您将原始字符串astring
传递给每个调用。因此,只有替换最后一个word[i]
才会“坚持”,而所有其他替换将被丢弃。
您可以通过分配result = astring
,然后按如下方式调用正则表达式来解决此问题:
result = Regex.Replace(
result
, @"\b"+Regex.Escape(words[i])+@"\b"
, ""
, RegexOptions.IgnoreCase
);
但是,这不是最理想的:你最好只构建一个正则表达式,并在一次性执行所有替换:
var allWords = @"\b"
+ string.Join("|", words.Select(w => Regex.Escape(w)))
+ @"\b";
result = Regex.Replace(astring, allWords, "", RegexOptions.IgnoreCase);