C # RegEx Замена - PullRequest
       19

C # RegEx Замена

1 голос
/ 16 марта 2011

Я добавляю фильтр ненормативной лексики, и я хотел бы заменить слово (или частичное слово), которое заменяется строкой равной длины. В равной части длины я испытываю трудности.

Таким образом, если заменяемое слово имеет длину 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);
}

Таким образом, если заменить слово «другое», оно будет заменено на «*% $ @ ^! #».

Если заменить "слово", оно будет заменено на "*% $ @ ^"

Если заменить «формулировку», она будет заменена на «*% $ @ ^ ing»

Обновление:

Я закончил тем, что нашел решение ...

Я создал новый метод:

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

Затем изменилось

return regex.Replace(text, replacement);

до

return regex.Replace(text, Censored);

1 Ответ

2 голосов
/ 16 марта 2011

Попробуйте этот подход:

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 метод , который принимает MatchEvaluator делегат . Я предоставляю MatchEvaluator через лямбда-выражение и получаю доступ к свойству Match.Length, чтобы определить длину ненормативной лексики.

Я переделал ваш шаблон, чтобы получить точные совпадения, поместив метасимвол \b в начале и конце альтернативных совпадений. Однако, исходя из вашего примера "wording" = "*% $ @ ^ ing", кажется, вы хотите поддерживать частичные совпадения. В этом случае вы должны опустить использование \b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...