JavaScript удалить слова менее 3 символов - PullRequest
4 голосов
/ 11 сентября 2011

Я устал, чтобы удалить все слова менее 3 символов, как in, on ,the....

Мой код не работает для меня, Uncaught TypeError: Object ... has no method 'replace' обратитесь за помощью.

var str = 'Proin néc turpis eget dolor dictǔm lacínia. Nullam nǔnc magna, tincidunt eǔ porta in, faucibus sèd magna. Suspendisse laoreet ornare ullamcorper. Nulla in tortòr nibh. Pellentesque sèd est vitae odio vestibulum aliquet in nec leo.';
var newstr = str.split(" ").replace(/(\b(\w{1,3})\b(\s|$))/g,'');
alert(newstr);

Ответы [ 6 ]

9 голосов
/ 11 сентября 2011

Вам нужно изменить порядок 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]|$))

... которое мне до сих пор не нравится, потому что мне пришлось вручную включить туда ǔ.

Увидеть это в действии .

4 голосов
/ 11 сентября 2011

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

str = str.split( ' ' ).filter(function ( str ) {
    var word = str.match(/(\w+)/);
    return word && word[0].length > 3;
}).join( ' ' );

Живая демоверсия: http://jsfiddle.net/sTfEs/1/

2 голосов
/ 12 сентября 2011

str.split(" ") возвращает массив, в котором нет метода замены.

Во-вторых, вы, вероятно, не используете для этого регулярные выражения.JavaScript не имеет хорошей поддержки не-ASCII букв в регулярных выражениях.См. Регулярное выражение для соответствия неанглийским символам? .Если вам нужно для использования регулярных выражений, здесь есть подсказки.

И кстати, во всех разновидностях регулярных выражений \w{1,3} НЕ соответствует "néc" Каквы, наверное, знаете, \w - это [A-Za-z_].См. http://jsfiddle.net/3YWSC/ для примера.

Вы пытаетесь сопоставить только слова без пробелов?Или вы ищете слова из трех или менее букв?С одной стороны, вы разделяете пробелы, а с другой - \w.Я бы пошел с чем-то вроде ответа Денниса.

1 голос
/ 11 сентября 2011
var words = str.split(" "); //Turns the string into an array of words
var longWords = []; //Initialize array
for(var i = 0; i<words.length; i++){
    if(words[i].length > 3) {
        longWords.push(words[i]);
    }
}
var newString = longWords.join(" "); //Create a new string of the words separated by spaces.
0 голосов
/ 11 мая 2017

Использование lodash с менее чем 20 символами:

let a = ['la','rivière','et','le','lapin','sont','dans','le','près'];

a = _.remove(_.uniq(a),n=>_.size(n)>3); // ['rivière','lapin','sont','dans','près']
0 голосов
/ 11 сентября 2011

Попробуйте

var newstr = str.replace(/(\b(\w{1,3})\b(\s|$))/g,'').split(" ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...