.net C#正则表达式替换

.net C#正则表达式替换,.net,regex,replace,substring,.net,Regex,Replace,Substring,我添加了一个亵渎过滤器,我想做的是用长度相等的字符串替换被替换的单词(或部分单词)。等长部分是我遇到困难的地方 因此,如果被替换的单词比我想要的文本长3个字符,那么它将被替换为3个字符。我不确定如何将替换字符串替换为子字符串以匹配被替换单词的长度 以下是我的测试方法: public static string ProfanityFilter(this string text) { string pattern = @"\bword\b|\bword2\b|\banother*";

我添加了一个亵渎过滤器,我想做的是用长度相等的字符串替换被替换的单词(或部分单词)。等长部分是我遇到困难的地方

因此,如果被替换的单词比我想要的文本长3个字符,那么它将被替换为3个字符。我不确定如何将替换字符串替换为子字符串以匹配被替换单词的长度

以下是我的测试方法:

public static string ProfanityFilter(this string text)
{
    string pattern = @"\bword\b|\bword2\b|\banother*";
    Regex regex = new Regex(pattern);
    string replacement = "*%$@^!#@!@$^()!";
    return regex.Replace(text, replacement);
}
因此,如果替换“另一个”一词,它将替换为“*%$@^!#”

如果将“word”替换为“*%$@^”

如果将“措辞”替换为“*%$@^ing”

更新:

我最终找到了解决办法

我创建了一个新方法:

 public static string Censored(Match match)
        {
            string replacement = "*%$@^!#@!@$^()!";
            return replacement.Substring(0, match.Captures[0].Length);
        }
然后改变

return regex.Replace(text, replacement);

尝试以下方法:

string input = "foo word bar word2 foobar another";
string pattern = @"\b(?:word|word2|another)\b";
string result = Regex.Replace(input, pattern, m => new String('*', m.Length));
Console.WriteLine(result);
其思想是使用重载函数来接受一个。我通过lambda表达式提供
MatchEvaluator
,并访问
Match.Length
属性以确定匹配亵渎的长度


我通过将
\b
元字符放在备选匹配的开始和结束处,重新定义了您的模式以获得精确匹配。但是,根据您的“措辞”=“*%$@^ing”示例,您似乎希望支持部分匹配。那样的话,你应该省略
\b

的用法,我试试看。我也找到了一种方法,并用我找到的方法更新了我的问题。我将在试用后接受您的方法。请注意,如果捕获长度超过替换字符串的长度,则使用
子字符串的新方法将引发异常。如果您确实希望替换字符串由所有这些不同的字符组成,则更安全的方法是从一组不同的字符构建替换字符串。否则,您可以指定一个字符,并使用
字符串
构造函数构建它,正如我在回答中所示。有趣的是,看看“赋值”会发生什么。我知道它可能会超过它,并且没有签入:)我没有完成。
string input = "foo word bar word2 foobar another";
string pattern = @"\b(?:word|word2|another)\b";
string result = Regex.Replace(input, pattern, m => new String('*', m.Length));
Console.WriteLine(result);