эффективный способ заменить несколько слов в тексте - PullRequest
11 голосов
/ 03 февраля 2010

Используя JavaScript, мне нужно эффективно удалить ~ 10000 ключевых слов из документа ~ 100000 слов, из которых ~ 1000 будут ключевыми словами. Какой подход вы бы предложили?

Будет ли практичным регулярное выражение массовое ? Или мне просто перебирать символы документа в поисках ключевых слов (скучно)?

Edit:
Хороший вопрос - только целые слова, а не части. А некоторые ключевые слова содержат пробелы.
Я пытаюсь сделать все это на стороне клиента, чтобы уменьшить нагрузку на бэкэнд.

Ответы [ 3 ]

6 голосов
/ 03 февраля 2010

Использование регулярного выражения может быть хорошим вариантом:

var words = ['bon', 'mad'];
'joe bon joe mad'.replace(new RegExp('(' + words.join('|') + ')', 'g'), '');
// 'joe  joe  '

Регулярное выражение 1 не очень сложно с такими вещами, как упреждающий просмотр, и механизм регулярных выражений написан на C / C ++, поэтому можно ожидать, что он будет довольно быстрым. Тем не менее - проведите тестирование и посмотрите, соответствует ли производительность вашим потребностям.

Я не думаю, что реализация вашего собственного парсера будет быстрее, но я могу ошибаться - эталонный тест.

Отправка документа на сервер звучит не очень хорошо для меня. Имея 100 тыс. Слов, вы смотрите на полезную нагрузку в диапазоне мегабайт, и вам все равно придется что-то делать с ней на сервере и отодвигать ее назад.


1 Возможно, вам придется настроить регулярное выражение, чтобы что-то сделать с пробелами.

0 голосов
/ 03 февраля 2010

Конечный автомат часто используется для подобных задач, например, http://www.codeproject.com/KB/string/civstringset.aspx

0 голосов
/ 03 февраля 2010

Мой инстинкт подсказывает мне, что для такого большого количества ключевых слов - сортировка ключевых слов и создание конечного автомата для каждого символа будет намного быстрее, чем регулярное выражение, поскольку конечный автомат тривиален, его можно сгенерировать автоматически.

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