Heim > Fragen und Antworten > Hauptteil
有一篇混合中英文的文章,我要得到它包含的单词,
我用下面的方法,但显然不是很准,请老司机帮助看一下。多谢
var str="1.tom:'what's your name.' 1.汤姆:“你的名字是什么?”";
str.match(/[a-zA-Z]+/ig);
//执行结果▶["tom", "what", "s", "your", "name"]
现状:已经能过滤掉大部分标点、数字、和中文
问题:what’s
这种词被拆成了2个数组,我不想要类似what’s
和x-ray
这种词。
如何修改正则表达式把它们排除出去?
就是出现what's
时,不要what
也不要s
也不要what's
谢谢老司机领路!^_^
大家讲道理2017-04-11 09:46:17
var str="1.tom:'what's your name.' 1.汤姆:“你的名字是什么?”";
str.match(/[a-z]+[\-\']?[a-z]*/ig);
// ["tom", "what's", "your", "name"]
更新
不包含这个需要分两步实现,负向预查做不到,会干掉wath'
但会保留s
这种结果。
var str="1.tom:'what's your name.' 1.汤姆:“你的名字是什么?”";
str.replace(/[a-z]+[\-|\']+[a-z]+/ig, '').match(/([a-z]+)/ig);
// ["tom", "your", "name"]
PHP中文网2017-04-11 09:46:17
我建议你先把带符号的单词一起搜出来之后再来过滤一次,
var str = "1.tom:'what's your name.' 1.汤姆:“你的名字是什么?”";
var m = str.match(/[a-z\-']+/ig);
console.log(m);
var result = (m || []).filter(function(word) {
return !word.match(/[^a-z]/);
});
console.log(result);
迷茫2017-04-11 09:46:17
由于js没有回顾零宽断言,你的需求似乎无法实现,不然可以用(?<=[^-'a-z]|^)[a-z]+(?=[^-'a-z]|$)
在js里可以加一步处理得到结果
(" "+str).match(/(?:[^-'a-z])[a-z]+(?=[^-'a-z])/ig).map(str => str.slice(1));