在字符串中搜索整个单词

6
我正在寻找一个用JavaScript编写的函数(不是jQuery),如果给定的单词完全匹配(不区分大小写),则将返回true。
例如...
var searchOnstring = " Hi, how are doing?"

   if( searchText == 'ho'){
     // Output: false
   }

   if( searchText == 'How'){
     // Output: true
   }

5
停止发布indexOf()的答案! - ComFreek
@ComFreek 哈哈,我会说11个答案中大约80%都是 indexOf :/ - tckmn
@ComFreek:但这很有趣,不是吗? - zerkms
@zerkms 现在我有一个7777的声誉,这很有趣 :) - ComFreek
1
@duffymo,我听到说类似话的最后一个人已经失踪了7年了... :( - pandita
显示剩余18条评论
4个回答

21
您可以使用正则表达式:
\bhow\b

例子:

/\bhow\b/i.test(searchOnstring);

如果你想要一个可变的单词(例如用户输入),那么你需要注意不要包含特殊的RegExp字符。

你必须转义它们,例如使用在MDN提供的函数(向下滚动一点)

function escapeRegExp(string){
  return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

var regex = '\\b';
regex += escapeRegExp(yourDynamicString);
regex += '\\b';

new RegExp(regex, "i").test(searchOnstring);

它显示错误,如:Uncaught TypeError: Object function RegExp() { [native code] } has no method 'escape'。 - Anand Jha
@anand4tech 在调用我的代码之前,你必须先包含那个函数。/谢谢 Doorknob。 - ComFreek
@anand4tech 看看我的编辑,我现在使用了MDN的转义函数。 /dystroy:谢谢。 - ComFreek
函数转义正则表达式(字符串){ 返回字符串.replace(/([.*+?^=!:${}()|[]/\])/g, "\$1"); } 函数 myFunction() { var yourDynamicString='how Are you'; var searchOnstring='how';var regex = '\b'; regex += escapeRegExp(yourDynamicString); regex += '\b'; alert(regex) var y= new RegExp(regex, 'i').test(searchOnstring); alert(y) } - Anand Jha
@anand4tech 1. 你把 yourDynamicStringsearchOnstring 搞混了。2. 即使在单引号中也必须转义 ''(我的错,抱歉)。3. 请使用分号。工作示例:http://jsfiddle.net/Ydr3R/ - ComFreek
显示剩余4条评论

3
以下是一个函数,当忽略大小写时,如果searchText包含在searchOnString中,则返回true:
function isMatch(searchOnString, searchText) {
  searchText = searchText.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
  return searchOnString.match(new RegExp("\\b"+searchText+"\\b", "i")) != null;
}

如先前所提到的,您应该转义输入内容,我正在使用https://dev59.com/AXA65IYBdhLWcg3w7DT8#3561711中的转义函数。


这是一个仅包含链接的回答,这是不被鼓励的。如果链接失效会发生什么?你的回答就变得无用了。而且,我们不希望人们在到达SO后再点击另一个链接。-1 - tckmn
@poida,你应该对 searchText 进行转义。 - ComFreek
现在这样做是错误的。而且你为什么要检查 null 呢? - tckmn
你试过了吗?(现在更好了,因为转义字符已经去掉了-1) - tckmn
@poida 我也取消了我的踩,但是应该将转义替换移到一个函数中(我知道这更多是风格上的问题)。 - ComFreek

-2

2
不匹配“That's how.”字符串。 - zerkms
1
不,他的意思是字符串“那就这样。”(或“你好吗?”) - tckmn
好的,我在提供的字符串上运行了我的测试,这是我的疏忽。 - faino
1
如果你提供的解决方案只适用于预定义的输入 - 你可以将其替换为 return true; - zerkms
@zerkms @tckmn “That's how.”和“How are you doing?”不是单词。为什么它们应该返回true? - poida

-5

试试这个:

var s = 'string to check', ss= 'to';
if(s.indexOf(ss) != -1){
  //output : true
}

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