Если вы настроили использование плюрализации, вам необходимо использовать PluralizationService
(см. this answer для получения дополнительной информации).
И, видя, что вы используете string.Format
, я предполагаю, что вы зацикливаете свой массив backlist.
Так почему бы не сделать все это в аккуратном методе?
public static string GetBlacklistRegexString(string[] blacklist)
{
//It seems that this service only support engligh natively, to check later
var ps = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en"));
//Using a StringBuilder for ease of use and performance,
//even though it's not easy on the eye :p
StringBuilder sb = new StringBuilder().Append(@"\b(");
//We're just going to make a unique regex with all the words
//and their plurals in a list, so we're looping here
foreach (var word in blacklist)
{
//Using a dot wasn't careful indeed... Feel free to replace
//"\W" with anything that does it for you. It will match
//any non-alphanumerical character
var regexPlural = ps.Pluralize(word).Replace(" ", @"\W");
var regexWord = word.Replace(" ", @"\W");
sb.Append(regexWord).Append('|').Append(regexPlural).Append('|');
}
sb.Remove(sb.Length - 1, 1); //removing the last '|'
sb.Append(@")\b");
return sb.ToString();
}
Использование ничего удивительного, если вы уже используете регулярные выражения в .NET:
static void Main(string[] args)
{
string[] blacklist = {"Goodbye","Welcome","join us"};
string input = "Welcome, come join us at dummywebsite.com for fun and games, goodbye!";
//I assume that you want it case insensitive
Regex blacklistRegex = new Regex(GetBlacklistRegexString(blacklist), RegexOptions.IgnoreCase);
foreach (Match match in blacklistRegex.Matches(input))
{
Console.WriteLine(match);
}
Console.ReadLine();
}
Мы пишутся на консоли ожидаемый результат:
- Добро пожаловать
- Присоединиться к нам
- goodbye
Редактировать: все еще есть проблема (работа над ней позже), если «человек» находится в ваших ключевых словах, он будет соответствовать «мужчинам» в «женщинах» ... странно, я не получаю такого поведения на regexhero.
Редактировать 2: duh, конечно, если я не группирую слова с круглыми скобками, границы слов применяются только к первому и последнему ... Исправлено.
Точки это может произойти немного слишком разрешительные и ложные срабатывания. Класс символов с выбранными символами - лучшая идея. –
Ваше регулярное выражение для множественного числа не будет работать для слов, которые заканчиваются на «y», например, страны/страны. Я не очень хорошо разбираюсь в строках регулярных выражений, поэтому у меня нет предложения о том, как это исправить. –
Слишком быстро на исправление действительно будет двойная проверка. – Kilazur