我厌倦了删除所有少于 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);
最佳答案
您需要更改 split
和 replace
的顺序:
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 regex 中做到这一点并不容易。我想出了这个正则表达式:
([^ǔa-z\u00C0-\u017E]([ǔa-z\u00C0-\u017E]{1,3})(?=[^ǔa-z\u00C0-\u017E]|$))
...我仍然不喜欢,因为我必须手动在其中包含
ǔ
。See it in action 。