【前端】如何用正则表达式匹配文章中的英文单词?谢谢^_^

有一篇混合中英文的文章,我要得到它包含的单词,
我用下面的方法,但显然不是很准,请老司机帮助看一下。多谢

var str="1.tom:'what's your name.' 1.汤姆:“你的名字是什么?”";

str.match(/[a-zA-Z]+/ig);

//执行结果▶["tom", "what", "s", "your", "name"]

现状:已经能过滤掉大部分标点、数字、和中文
问题:what’s 这种词被拆成了2个数组,我不想要类似what’sx-ray这种词。
如何修改正则表达式把它们排除出去?
就是出现what's时,不要what也不要s也不要what's
谢谢老司机领路!^_^

回答

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

我建议你先把带符号的单词一起搜出来之后再来过滤一次,

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);

【前端】如何用正则表达式匹配文章中的英文单词?谢谢^_^

由于js没有回顾零宽断言,你的需求似乎无法实现,不然可以用(?<=[^-'a-z]|^)[a-z]+(?=[^-'a-z]|$)

在js里可以加一步处理得到结果

(" "+str).match(/(?:[^-'a-z])[a-z]+(?=[^-'a-z])/ig).map(str => str.slice(1));

以上是 【前端】如何用正则表达式匹配文章中的英文单词?谢谢^_^ 的全部内容, 来源链接: utcz.com/a/81493.html

回到顶部