JavaScript如何查找字符串中单词的位置(而不是单词的一部分)

17

我目前正在使用 str.indexOf("word") 来查找字符串中的单词。但问题是它也会返回其他单词的一部分。

例如:"我去了foobar并点了foo。" 我想要单词 "foo" 的第一个索引,而不是 foobar 中的 "foo"

我不能搜索 "foo ",因为有时它可能会跟随着句号或逗号 (任何非字母数字字符)。


3
您有六个问题没有被接受的答案。返回并接受一个答案,人们就会愿意回答这个问题。 - jeremy
好的,谢谢。我不知道我有一个名为“user759885”的持久账户,现在我已经检查并完成了相关操作。 - user759885
3个回答

31

你需要使用正则表达式来解决这个问题:

> 'I went to the foobar and ordered foo.'.indexOf('foo')
14
> 'I went to the foobar and ordered foo.'.search(/\bfoo\b/)
33

/\bfoo\b/ 匹配被单词边界所包围的 foo

要匹配任意单词,请构造一个 RegExp 对象:

> var word = 'foo';
> var regex = new RegExp('\\b' + word + '\\b');
> 'I went to the foobar and ordered foo.'.search(regex);
33

这不是一个完美的解决方案。例如,变量 word = '.'; 变量 regex = new RegExp('\b' + word + '\b'); alert('I went to the foobar and ordered foo.'.search(regex)); 这将返回 0。 - immayankmodi
@MMTac: JavaScript没有像Python的re.escape()一样的等价物,所以点号不被当作字面上的点号对待。 - Blender
@Blender:感谢您提供如此有用的指导。 - immayankmodi
1
@Blender FYI,JavaScript中的\\b边界不适用于非英语但完全是字母数字字符,例如à、é、ö。 new RegExp("\\bestá\\b").test('¿dónde está la alcaldesa?')返回False,但有趣的是new RegExp("\\bdónde\\b").test('¿dónde está la alcaldesa?')返回True。 - user3871
@Growler,你知道如何解决你所谈论的这个问题吗?我在一个翻译脚本上遇到了同样的问题,它无法处理字符串"se acordó",因为它以"ó"结尾。 - videomugre
显示剩余4条评论

7

对于一般情况,使用RegExp构造函数创建由单词边界限定的正则表达式:

function matchWord(s, word) {
  var re = new RegExp( '\\b' + word + '\\b');
  return s.match(re);
}

请注意,连字符被视为单词边界,因此 sun-dried 是两个单词。

0

我已经尝试过使用“.search”和“.match”,正如之前的答案所建议的那样,但只有这个解决方案对我起作用。

var str = 'Lorem Ipsum Docet';
var kw  = 'IPSUM';
var res = new RegExp('\\b('+kw+')\\b','i').test(str);

console.log(res); // true (...or false)

使用'i'进行不区分大小写搜索。

ComFreek在这里写了一个详细的答案链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接