regex.test VS string.match知道字符串是否与正则表达式匹配

gdo*_*ica 272 javascript regex performance

很多时候我使用字符串match函数来知道字符串是否与正则表达式匹配.

if(str.match(/{regex}/))
Run Code Online (Sandbox Code Playgroud)

这有什么区别:

if (/{regex}/.test(str))
Run Code Online (Sandbox Code Playgroud)

他们似乎给出了相同的结果?

gdo*_*ica 418

基本用法

首先,让我们看看每个函数的作用:

regexObject.测试(字符串)

执行正则表达式与指定字符串之间匹配的搜索.返回truefalse.

字符串.匹配(RegExp)

用于在将字符串与正则表达式匹配时检索匹配项.返回包含匹配项的数组,null如果没有匹配项.

null评估到false,

if ( string.match(regex) ) {
  // There was a match.
} else {
  // No match.
} 
Run Code Online (Sandbox Code Playgroud)

性能

表现有什么不同吗?

是的.我在MDN网站上发现了这个简短的说明:

如果您需要知道字符串是否与正则表达式regexp匹配,请使用regexp.test(string).

差异显着吗?

答案再一次是肯定的!我把这个jsPerf放在一起显示差异是 ~30% - ~60%取决于浏览器:

测试vs匹配|  性能测试

结论

使用.test,如果你想更快的布尔检查.用于.match在使用g全局标志时检索所有匹配项.

  • 我的两分钱:表现被高估了.任何一个选项都可以在监视器的闪烁中执行~15,000次操作,因此除非您正在进行批量正则表达式客户端,否则速度无关紧要.当然,如果布尔结果是您所追求的,那么'test'在逻辑上是正确的函数.感谢Q/A BTW. (19认同)
  • 不要太惊讶,因为字符串函数需要翻转然后如果匹配则创建数组.看起来我会继续使用`.test()`.:) (5认同)
  • 有一件事可能会困扰您(最近它困扰了我的团队):如果您在正则表达式上使用“g”标志并创建一个新实例(即通过 new RegExp(<regex_str>, 'g')),然后重用它例如,运行“test”是有状态的,即多次运行时将返回不同的结果。有关详细信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test#Using_test()_on_a_regex_with_the_global_flag。 (3认同)
  • 有趣的是,使用上面的 jsPerf 测试(Chrome 41,OSX),测试比我的匹配慢 41%。 (2认同)

gto*_*nie 101

不要忘记考虑正则表达式中的全局标志:

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=
Run Code Online (Sandbox Code Playgroud)

这是因为当找到新匹配时,Regexp会跟踪lastIndex.

  • 我只是头部敲打看到我的regex.test()随机记录"true"然后"false"然后"true"...谢谢! (16认同)
  • 我认为这是更好的答案.它解释说他们没有给出相同的结果,并且reg.test()有一个危险的陷阱.对我来说,这使得string.match()成为明智的选择.对我来说,性能从来都不是问题. (7认同)
  • 只是好奇,为.test()`设置全局标志有什么意义?是不是`.test()`检查字符串是否匹配正则表达式? (3认同)
  • 这个很重要!疯狂地试图找出为什么其他所有结果都丢失了...供其他发现此结果的人参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/ lastIndex (2认同)
  • 如果您像我一样困惑,请访问http://stackoverflow.com/q/1520800/3714913。还有[String.prototype.search()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search),它返回索引但没有索引据我所知,这个问题。 (2认同)