2011-03-16 51 views
1

我加入一個褻瀆濾波器和我想要做的就是替換的單詞(或部分字)這是替換爲等長的字符串。等長的部分是我遇到困難的地方。C#正則表達式替換

所以,如果被替換的單詞是長3個字符,比我想它與要長3個字符替換的文本。我不知道如何將替換字符串進行子串匹配以匹配被替換的單詞的長度。

這裏是我的測試方法:

public static string ProfanityFilter(this string text) 
{ 
    string pattern = @"\bword\b|\bword2\b|\banother*"; 
    Regex regex = new Regex(pattern); 
    string replacement = "*%[email protected]^!#@[email protected]$^()!"; 
    return regex.Replace(text, replacement); 
} 

所以,如果 「另一個」 被替換詞,將它與 「!*%$ @ ^#」 代替。

如果更換它會被替換成 「字」, 「*%$ @ ^」

如果 「措辭」 被替換,將用 「*%$ @^ing」 的

更新替換:

我最終找到解決方案...

我創建了一個新的方法:

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

然後改變

return regex.Replace(text, replacement); 

return regex.Replace(text, Censored); 
+0

要知道,你的新方法,使用'Substring',如果將拍攝長度超過了替換字符串的長度拋出異常。如果你真的希望它包含所有不同的字符,一個更安全的方法是從一組不同的字符中建立替換字符串。否則,您可以指定一個字符並使用String構造函數構建它,就像我在答案中所示的那樣。 – 2011-03-16 18:44:21

+0

有趣的是看看發生了什麼「分配」。 – 2011-03-16 18:52:56

+0

我知道,它可能會超過它,:)我還沒有完成有沒有在那裏進行檢查。 – GregInWI2 2011-03-17 21:50:11

回答

2

試試這個辦法:

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

的想法是使用重載Regex.Replace method接受一個MatchEvaluator delegate。我經由lambda表達式提供MatchEvaluator和訪問Match.Length屬性來確定匹配褻瀆的長度。

我通過將\b元字符在備選的匹配的開始和結束重做你的模式有精確匹配。但是,根據您的「措辭」=「*%$ @^ing」示例,似乎您想支持部分匹配。在這種情況下,您應該省略使用\b

+0

我會試試看。我找到了一種方法,並用我找到的方法更新了我的問題。我嘗試一下後會接受你的。 – GregInWI2 2011-03-16 18:38:11