如何使indexOf仅匹配'hi'作为匹配而不是'hirandomstuffhere'?

时间:2014-07-11 20:32:20

标签: javascript node.js

基本上我在一段时间之前玩过一个Steam机器人,并且当你在一个数组中说出一些东西时自动回复,IE是一个'hello-triggers'数组,其中包含“hi”,“你好“等等。每当收到消息时我就会这样做,它会使用indexOf()检查匹配,一切正常,直到我注意到它会注意到'hiasodkaso',或者像'hidemyass'作为“hi”触发器。

所以即使它在一个单词的中间,它也会匹配包含该单词的任何内容。

我如何才能使indexOf只注意到它是否是确切的单词,而不是同一个单词中的其他内容?

我没有使用的脚本,但我会做一个非常类似的例子:

var hiTriggers = ['hi', 'hello', 'yo'];

// here goes the receiving message function and what not, then:

for(var i = 0; i < hiTriggers.length; i++) {
if(message.indexOf(hiTriggers[i]) >= 0) {
bot.sendMessage(SteamID, randomHelloMsg[Math stuff here blabla]); // randomHelloMsg is already defined
}
}

正则表达式不会用于此,对吧?因为它用于表达式或其他任何东西。 (我的英语不是很棒,ikr)

提前致谢。如果我对某些事情不够清楚,请告诉我,我会以另一种方式编辑/制定它! :)

2 个答案:

答案 0 :(得分:0)

您可以扩展原型:

String.prototype.regexIndexOf = function(regex, startpos) {
    var indexOf = this.substring(startpos || 0).search(regex);
    return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}

并且做:

var foo = "hia hi hello";
foo.regexIndexOf(/hi\b/);

或者,如果您不想扩展字符串对象:

foo.substr(i).search(/hi\b/); 

这两个例子都来自Is there a version of JavaScript's String.indexOf() that allows for regular expressions?

的最高答案

答案 1 :(得分:0)

  

正则表达式不会用于此,对吧?因为它用于表达式或其他任何东西。 (我的&gt;英语不太棒,ikr)

实际上,正则表达式适用于任何旧的模式匹配。这对此非常有用。

fmsf的答案应该适用于您正在尝试的内容,但是,通常扩展本机对象原型是不满意的。您可以通过这样做轻松破坏库。我会尽可能避免它。在这种情况下,您可以单独使用他的regexIndexOf函数,也可以与以下内容一起使用:

    //takes a word and searches for it using regexIndexOf
    function regexIndexWord(word){
        return regexIndexOf("/"+word+"\b/");
    }

这将允许您根据您的单词数组进行搜索,而无需为每个单词添加特殊符号。