Javascript在字符串中查找单词的索引(不是单词的一部分)

Posted

技术标签:

【中文标题】Javascript在字符串中查找单词的索引(不是单词的一部分)【英文标题】:Javascript find index of word in string (not part of word) 【发布时间】:2012-09-28 05:49:24 【问题描述】:

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

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

我无法搜索“foo”,因为有时它后面可能会跟一个句号或逗号(任何非字母数字字符)。

【问题讨论】:

您有六个问题没有被接受的答案。返回并接受一个答案,人们就会愿意在这个答案上发帖。 好的,谢谢,我不知道我有一个名为“user759885”的永久帐户,我已经完成了。 【参考方案1】:

我已经尝试过使用“.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写了详细回答here

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

您必须为此使用正则表达式:

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

【讨论】:

尝试了一个一般案例,但我的实现似乎不起作用。 reg = '/\b' + word+ '\b/'; str.indexOf(reg); 如果你想编写正则表达式,你需要两个步骤:双花键 "\" ("\\b") 并调用 RegExp 构造函数:reg = new RegExp("\\b" + word + "\\b"); 啊,我看到 indexOf 不使用正则表达式,所以你使用了search()。我的最终解决方案是使用reg = '\\b(' + word + ')\\b'; str.indexOf(reg); @user759885:查看我的编辑。您必须构造一个 RegExp 对象。 @Blender FYI \\b javascript 中的边界不适用于非英语但其他完美的字母数字字符,如 à、é、ö。 new RegExp("\\bestá\\b").test('¿dónde está la alcaldesa?') 返回 False,但奇怪的是 new RegExp("\\bdónde\\b").test('¿dónde está la alcaldesa?') 返回 True。

以上是关于Javascript在字符串中查找单词的索引(不是单词的一部分)的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Objective-C:查找字符串中单词的索引

如何查找字符串中所有出现的单词的所有索引[重复]

使用数组在字符串中查找特定单词(JavaScript)[重复]

在多行字符串中获取单词'print'的索引

Javascript reduce() 查找字符串中最短的单词

使用二进制搜索的 Java 前缀搜索