Вам нужно изменить порядок split
и replace
:
var newstr = str.replace(/(\b(\w{1,3})\b(\s|$))/g,'').split(" ");
В противном случае вы в конечном итоге вызовете replace
для массива, у которого нет этого метода.
См. Это в действии .
Примечание: Ваше текущее регулярное выражение неправильно обрабатывает случай, когда "короткое" словосразу после знака препинания.Вы можете немного изменить его, чтобы сделать это:
/(\b(\w{1,3})\b(\W|$))/g
^^
Кроме того, вам также нужно позаботиться о том, чтобы результирующий массив мог содержать пустые строки (поскольку удаление последовательных коротких слов, разделенных пробелами, закончитсяоставляя последовательные пробелы в строке до ее разделения).Таким образом, вы также можете изменить, как вы split
.Все это дает нам:
var newstr = str.replace(/(\b(\w{1,3})\b(\W|$))/g,'').split(/\s+/);
Смотрите это в действии .
Обновление: Как Рэй Тул правильноуказывает в комментарии, в регулярных выражениях JavaScript \w
не не соответствует не-ASCII символам (например, символы с акцентами).Это означает, что приведенные выше регулярные выражения не будут работать правильно (они будут работать правильно на некоторых других разновидностях регулярных выражений).К сожалению, нет удобного способа обойти это, и вам придется заменить \w
на группу символов, такую как [a-zA-Zéǔí]
, и сделать обратное для \W
.
Обновление:
Тьфу, сделать это в регулярном выражении JavaScript нелегко.Я придумал это регулярное выражение:
([^ǔa-z\u00C0-\u017E]([ǔa-z\u00C0-\u017E]{1,3})(?=[^ǔa-z\u00C0-\u017E]|$))
... которое мне до сих пор не нравится, потому что мне пришлось вручную включить туда ǔ
.
Увидеть это в действии .