Я делаю фильтр ненормативной лексики (плохая идея, которую я знаю), и я пытаюсь сделать это с помощью регулярных выражений в Java.
Прямо сейчас вот пример строки с регулярным выражением, это отфильтровывает 2 слова,foo и bar.
(?i)f(?>[.,;:*`'^+~\\/#|]*+|.)o(?>[.,;:*`'^+~\\/#|]*+|.)o|b(?>[.,;:*`'^+~\\/#|]*+|.)a(?>[.,;:*`'^+~\\/#|]*+|.)r
По сути, я игнорирую регистр, затем помещаю (?>[.,;:*'^+~\\/#|]*+|.)
между каждой буквой проклятого слова и |
между каждым полным регулярным словом regex.
Работает, но довольно медленно.
Если в фильтре 6 слов, он отфильтрует довольно длинную строку (500 символов) за 939 548 наносекунд.Когда у меня 12, оно примерно удваивается.
Итак, примерно 1 мс на 6 ругательств с этим.Но мой фильтр будет иметь сотни (400 или около того).Для расчета этой длинной строки потребуется около 66 мс.
Это сервер чата, который я создаю, и если у меня много пользователей (скажем, 5000) и 1 из 5 общаются в чатеза 1 секунду (1000 сообщений чата) мне нужно отфильтровать сообщение примерно за 1 мс.
Требуется ли слишком много регулярных выражений?Будет ли быстрее сделать свой собственный специализированный тип фильтра вручную?Есть ли способы оптимизировать это?
Я прекомпилирую регулярное выражение.
Если вы хотите увидеть эффект этого регулярного выражения http://regexr.com? 30454
Обновление: Еще одна вещь, которую я мог бы сделать, - это фильтровать сообщения чата на стороне клиента в ActionScript.
Обновление: Я считаю, что единственный способ достичь такой степени производительностибыло бы решением с ручным кодированием без использования регулярных выражений, к сожалению, поэтому мне придется сделать более простой фильтр.