【问题标题】:What is wrong with my regex concatenation?我的正则表达式连接有什么问题?
【发布时间】:2018-04-04 02:19:51
【问题描述】:

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

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

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

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

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

请帮忙!

【问题讨论】:

  • 因此变量结果将具有 Replaced 值。 (假设正则表达式有效)——你期待什么?您能否添加示例输入字符串和一些转义词 - 以便我们可以验证您的正则表达式。

标签: c# regex visual-studio concatenation


【解决方案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

【讨论】:

    【解决方案2】:

    words[i] 内使用索引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);
    

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 2012-02-24
      • 2013-04-11
      • 2014-08-26
      • 1970-01-01
      相关资源
      最近更新 更多