如何最好地检查一个字符串是否存在于另一个字符串中?

36

可能会有重复:
JavaScript:字符串包含

我正在寻找一种算法来检查一个字符串是否存在于另一个字符串中。

例如:

'Hello, my name is jonh LOL.'.contains('Hello, my name is jonh'); //true
'LOL. Hello, my name is jonh'.contains('Hello, my name is jonh'); //true

提前感谢。


这里是检查字符串是否在另一个字符串中最常见的基准测试方法:http://jsben.ch/#/o6KmH - EscapeNetscape
5个回答

28

使用 indexOf 方法:

'Hello, my name is jonh LOL.'.indexOf('Hello, my name is jonh') > -1; //true
'LOL. Hello, my name is jonh'.indexOf('Hello, my name is jonh') > -1; //true

你也可以扩展String.prototype以拥有一个contains函数:

String.prototype.contains = function(substr) {
  return this.indexOf(substr) > -1;
}
'Hello, my name is jonh LOL.'.contains('Hello, my name is jonh'); //true
'LOL. Hello, my name is jonh'.contains('Hello, my name is jonh'); //true

1
除了这个答案之外,你还可以创建 function contains(haystack, needle) { return haystack.indexOf(needle) > -1; } 或者在 String 原型上创建一个。 - Jonathan Fingland
@Jonathan 我添加了一个 String.prototype 函数。 - Digital Plane

1
正如Digital所指出的那样,indexOf方法是检查的方式。如果你想要一个更具说明性的名称,比如contains,那么你可以将它添加到String原型中。
String.prototype.contains = function(toCheck) {
  return this.indexOf(toCheck) >= 0;
}

之后您的原始代码示例将按照原样正常工作


1

去尝试一下变得不为人知怎么样:

!!~'Hello, my name is jonh LOL.'.indexOf('Hello, my name is jonh'); //true
if(~'LOL. Hello, my name is jonh'.indexOf('Hello, my name is jonh'))
    alert(true);

使用位非运算符和布尔非运算符将其转换为布尔值,然后再将其转换回来。


虽然这个可以工作,但是 val > -1 的操作更少。 - zzzzBov
@zzzzBov,从技术上讲,!! 是不必要的。因此只需要使用波浪号即可。 - Joe
根据您需要布尔值的严格程度而定。我同意,~将输出正确的falsey状态。 - zzzzBov

0

我认为使用预编译的基于Perl的正则表达式会非常高效。

RegEx rx = new Regex('Hello, my name is jonh', RegexOptions.Compiled);
rx.IsMatch('Hello, my name is jonh LOL.'); // true

我正在使用JavaScript,但谢谢:P - The Mask
更好的写法:var regex = /你好,我的名字是约翰/; regex.test("你好,我的名字是约翰 LOL。"); // true - clarkb86

0
另一个选项是使用match()函数来匹配正则表达式:http://www.w3schools.com/jsref/jsref_match.asp
> var foo = "foo";
> console.log(foo.match(/bar/));
null
> console.log(foo.match(/foo/));
[ 'foo', index: 0, input: 'foo' ]

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