javascript删除少于3个字符的单词

时间:2011-09-11 19:51:45

标签: javascript replace

我很遗憾删除少于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 个答案:

答案 0 :(得分:9)

您需要更改splitreplace的顺序:

var newstr = str.replace(/(\b(\w{1,3})\b(\s|$))/g,'').split(" ");

否则,您最终会在没有此方法的数组上调用replace

<强> See it in action

注意:您当前的正则表达式无法正确处理“短”字后面紧跟着标点字符的情况。您可以稍微更改它:

/(\b(\w{1,3})\b(\W|$))/g
                ^^

除此之外,您还必须注意这样一个事实:结果数组可能包含空字符串(因为删除由空格分隔的连续短字将最终在字符串分割前留下连续的空格)。因此,您可能还想更改split的方式。所有这一切都给了我们:

var newstr = str.replace(/(\b(\w{1,3})\b(\W|$))/g,'').split(/\s+/);

<强> See it in action

更新:正如Ray Toal在评论中正确指出的那样,在JavaScript正则表达式\w匹配非ASCII字符(例如带重音的字符) 。这意味着上面的正则表达式将无法正常工作(它们将在某些其他正则表达式上正常工作)。遗憾的是,没有方便的方法,您必须将\w替换为[a-zA-Zéǔí]等字符组,然后与\W进行相反的操作。

<强>更新

呃,在JavaScript正则表达式中这样做并不容易。我想出了这个正则表达式:

([^ǔa-z\u00C0-\u017E]([ǔa-z\u00C0-\u017E]{1,3})(?=[^ǔa-z\u00C0-\u017E]|$))

...我仍然不喜欢,因为我必须在那里手动包含ǔ

<强> See it in action

答案 1 :(得分:4)

试试这个:

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

现场演示: http://jsfiddle.net/sTfEs/1/

答案 2 :(得分:2)

str.split(" ")返回一个没有替换方法的数组。

其次,您可能不使用正则表达式。 JavaScript对正则表达式中的非ASCII字母没有很好的支持。见Regular expression to match non-English characters?。如果你需要使用正则表达式,那里有提示。

而BTW,在所有正则表达式中,\w{1,3} 匹配"néc"您可能知道,\w[A-Za-z_]。有关示例,请参阅http://jsfiddle.net/3YWSC/

你只是想匹配非空格的单词吗?或者您是否只想要三个或更少字母的单词?一方面你分开了空格,但另一方面你使用了\w。我会选择丹尼斯的答案。

答案 3 :(得分:1)

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.

答案 4 :(得分:0)

尝试

var newstr = str.replace(/(\b(\w{1,3})\b(\s|$))/g,'').split(" ");

答案 5 :(得分:0)

使用少于20个字符的lodash:

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']