在haystack中找到完全匹配,但仅当文本不是较大的字符串的一部分时

时间:2015-03-19 22:05:57

标签: javascript jquery

我的google-fu在这里失败了,因为我不知道如何在没有获得通用结果的情况下搜索答案,以便在javascript中在大海捞针中查找字符串针。如果这是一个重复的问题,请告诉我,我将把这个问题关闭。

我想做的事

我目前正在使用javascript中的indexOf()搜索文本,以查找以@字符开头的用户用户名的任何出现。 indexOf在大多数情况下运行良好,但是当用户的名字也是另一个用户名的一部分时,它就失败了。

例如,使用indexOf(),我当前获得用户名的匹配" RandomDonkey"当有文字针对" @ RandomDonkeyKong"或" @ RandomDonkeyFarmer"。

我正在寻找

我想找到最有效的方法来确保包含(例如)" @ RandomDonkeyFarmer"不要为用户提供警报" RandomDonkey",因为只有完全匹配而且#34; @ RandomDonkey"的用户名中不包含额外的字符。应该引起警觉。

我考虑的内容

我不擅长写正则表达式,所以我认为这是一个可能的解决方案,但我不确定如何编写它。

我还考虑过寻找匹配,并进一步检查除了最后一个字符后的空格以外没有其他字符(假设用户名没有结束字符串)。

有没有更好的方法来解决这个问题,或者这两种解决方案中哪一种最有效?

我目前正在使用的代码以及应该通过/失败的一些示例

var username = 'RandomDonkey';

if(message.toLowerCase().indexOf('@' + username.toLowerCase()) != -1){
   alert('this is a direct message');
}//if direct message
else{
    alert('this is NOT a direct message');
}

应该传递的一些消息:

message = "Hey @randomdonkey what's going on?";
message = "@RandomDonkey what are you up to";
message = "These are silly examples @RandomDonkey";

一些应该失败的消息:

message = "@RandomDonkeyKong is not a match for RandomDonkey";
message = "I'm messaging @RandomDonkeyFarmer";

目前所有这些示例都是因为indexOf()的工作方式而传递的,这就是我寻找另一种方法的原因。

1 个答案:

答案 0 :(得分:2)

我相信正则表达式确实是答案。这适用于大多数情况:

var username = "RandomDonkey"
var text = "hey @RandomDonkey are you something something etc."

var re=new RegExp("@"+username+"\b", "i")
if (re.test(text)) {
    alert(username);
}

当用户名中只能包含单词字符时(这样A-Z,a-z,0-9和下划线字符_)

要允许带有破折号的用户名以便不会破坏,请在正则表达式中使用此代替"\b""([^\\w\\-]|$)"

因此正则表达式定义行变为:var re=new RegExp("@"+username+"([^\\w\\-]|$)", "i")

它会查找没有匹配单词字符或短划线的字符,因此任何密码都不应包含,或字符串的结尾。

可能出现的唯一问题是人们的用户名中是否有特殊的正则表达式字符,只需禁止不匹配^[\w\-]+$的用户名(一个或多个字母,数字,短划线)就可以轻松预防和下划线,仅此而已)