我的正则表达式连接有什么问题?

时间:2018-04-04 02:19:52

标签: c# regex visual-studio concatenation

我很困惑为什么这行是我的代码没有对输入的字符串做任何事情。

result = Regex.Replace(astring, @"\b"+Regex.Escape(words[i])+@"\b", "", RegexOptions.IgnoreCase);

所以基本上我有一个方法,它接受一个字符串,如果它在禁止的单词数组中,将用空字符串替换字符串中的单词。我也试过了。

result = Regex.Replace(astring, @"\b"+words[i]+@"\b", "", RegexOptions.IgnoreCase);

我的数组或其他任何东西都没有错,因为没有使用正则表达式它将替换子字符串,但我需要它来匹配和替换整个单词,这就是为什么我使用正则表达式。

请帮忙!

2 个答案:

答案 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

Demo here

答案 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);