我的google-fu在这里使我失败了,因为我不确定如何在没有获得用于在javascript的大海捞针中找到字符串的通用结果的情况下搜索答案。如果这是一个重复的问题,请让我知道,我将结束这个问题。
我想做什么
我目前正在使用JavaScript中的indexOf()搜索文本,以查找以@ char开头的用户名。indexOf在大多数情况下都可以正常工作,但是当用户使用的名称也属于另一个用户的名称时,失败。
例如,使用indexOf(),当文本指向“ @RandomDonkeyKong”或“ @RandomDonkeyFarmer”时,我当前获得与用户名“ RandomDonkey”的匹配。
我在寻找什么
我想找到一种最有效的方法,以确保包含(例如)“ @ RandomDonkeyFarmer”的消息不会引起用户“ RandomDonkey”的警报,因为仅完全匹配,而用户名中没有多余的字符@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()的工作方式,这就是为什么我正在寻找另一种方法的原因。
我相信正则表达式确实是答案。这在大多数情况下应该有效:
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);
}
当用户名中只能包含单词字符(例如AZ,az,0-9和下划线字符_)时,此方法有效
要允许用户名带有破折号,以便不间断,请"\b"
在正则表达式中使用它:"([^\\w\\-]|$)"
因此,正则表达式定义行变为: var re=new RegExp("@"+username+"([^\\w\\-]|$)", "i")
它寻找与单词字符或破折号不匹配的字符,因此任何密码都不应包含或字符串的末尾。
可能出现的唯一问题是,如果用户名中包含特殊的正则表达式字符,只需禁止不匹配的用户名^[\w\-]+$
(一个或多个字母,数字,破折号和下划线,仅此而已)即可轻松避免。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句