检查字符串的最快方法是在JavaScript中包含另一个子字符串?

Đin*_*hâu 150 javascript regex substring

我正在处理JavaScript上的性能问题.所以我只想问:检查字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您能否提出您的想法和示例代码段?

Fel*_*ing 300

你有两个可能性:

  1. 正则表达式:

    (new RegExp('word')).test(str)
    // or
    /word/.test(str)
    
    Run Code Online (Sandbox Code Playgroud)
  2. indexOf:

    str.indexOf('word') !== -1
    
    Run Code Online (Sandbox Code Playgroud)

正则表达式似乎更快(至少在Chrome 10中).

性能测试 - 短干草堆
性能测试 - 长干草堆


2011年更新:

不能肯定地说哪种方法更快.浏览器之间的差异是巨大的.虽然在Chrome 10中indexOf看起来更快,但在Safari 5中,indexOf显然比任何其他方法都慢.

你必须看到并尝试自己.这取决于您的需求.例如,使用正则表达式时,不区分大小写的搜索会更快.


更新2018年:

为了避免人们自己运行测试,以下是大多数常见浏览器的当前结果,百分比表示下一个最快结果的性能提升(因浏览器而异):

Chrome: indexOf(快约98%)<-- wow
Firefox:缓存RegExp(快18%)
IE11:缓存RegExp(快10%)
边缘: indexOf(快18%)
Safari:缓存RegExp(快0.4%)

请注意,缓存的RegExp是:var r = new RegExp('simple'); var c = r.test(str);而不是:/simple/.test(str)

  • 只有在事先知道text-to-search-for(即没有存储在变量中)时,这可能会快一点,因为正则表达式是在解析时由JavaScript引擎创建的.如果要在另一个字符串变量中搜索变量中包含的字符串,indexOf是最快的,因为您需要创建一个RegExp对象并处理该字符串以转义特殊字符等. (2认同)
  • 根据经验,如果您在首先搜索的内容上使用 .toLowerCase,则 indexOf 可以更快地进行不区分大小写的搜索 (2认同)
  • @Bison:如果您已经知道要查找的位置,则只能使用 substr。我只关注通用解决方案。 (2认同)

Ste*_*ung 18

这对你有用吗?

string1.indexOf(string2) >= 0
Run Code Online (Sandbox Code Playgroud)

编辑:如果string2包含重复的模式,这可能不会比RegExp快.在某些浏览器中,indexOf可能比RegExp慢得多.看评论.

编辑2:当字符串很长和/或包含重复模式时,RegExp可能比indexOf更快.请参阅评论和@Felix的答案.

  • 刚刚在Safari中进行了测试.`indexOf`比任何其他方法都慢.所以实际上不能说哪种方法更快.它因浏览器而异. (3认同)

wpg*_*665 8

我发现使用一个简单的for循环,遍历字符串中的所有元素并进行比较使用charAtindexOf或更快的执行Regex.JSPerf提供了代码和证明.

ETA:indexOfcharAt两个根据上jsperf.com列出浏览器范围数据上的移动浏览器执行类似的可怕


Tín*_*ang 8

最快的

  1. (ES6)包括
    var string =“ hello”,
    substring =“ lo”;
    string.includes(substring);
  1. ES5和较旧的indexOf
    var string =“ hello”,
    substring =“ lo”;
    string.indexOf(substring)!== -1;

http://jsben.ch/9cwLJ

在此处输入图片说明


zan*_*ngw 7

在ES6中,该includes()方法用于确定是否可以在另一个字符串中找到一个字符串,返回truefalse视情况而定.

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be'));       // true
console.log(str.includes('question'));    // true
console.log(str.includes('nonexistent')); // false
Run Code Online (Sandbox Code Playgroud)

这是jsperf之间

var ret = str.includes('one');
Run Code Online (Sandbox Code Playgroud)

var ret = (str.indexOf('one') !== -1);
Run Code Online (Sandbox Code Playgroud)

正如jsperf中显示的结果,它们似乎都表现良好.


Ant*_*nko 5

使用.match()方法来字符串是很简单的方法。

var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));
Run Code Online (Sandbox Code Playgroud)

祝您有美好的一天,先生!

  • 当有“测试”方法时,没有理由“匹配”……查看最佳答案。 (5认同)