regex.test VS string.match 以了解字符串是否与正则表达式匹配

IT技术 javascript regex performance
2021-02-05 00:34:56

很多时候,我使用字符串match函数来了解字符串是否与正则表达式匹配。

if(str.match(/{regex}/))

这有什么区别吗:

if (/{regex}/.test(str))

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

2个回答

基本用法

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

正则表达式对象测试字符串

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

字符串匹配正则表达式

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

由于null评估为false

if ( string.match(regex) ) {
  // There was a match.
} else {
  // No match.
} 

表现

性能上有什么区别吗?

是的我在MDN 站点中找到了这个简短的说明

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

差异显着吗?

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

测试与匹配 |  性能测试

结论

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

不用太惊讶,因为字符串函数需要翻转事物,然后在匹配时创建数组。看来我会继续使用.test(). :)
2021-03-14 00:34:56
一件事可能会困扰您(最近它困扰了我的团队):如果您在 Regex 上使用 'g' 标志并创建一个新实例(即通过 new RegExp(<regex_str>, 'g'))并且您重用它例如,运行“test”是有状态的,即多次运行会返回不同的结果。有关详细信息,请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...。
2021-03-21 00:34:56
有趣的是,使用上面的 jsPerf 测试(Chrome 41,OSX),测试比我的匹配慢 41%。
2021-03-26 00:34:56
@AlexShilman indexOf 比根据此stackoverflow.com/questions/183496/... 进行的测试更快(但不是很多)(您希望它更快)。
2021-03-30 00:34:56
我的两分钱:性能被高估了。任一选项都可以在监视器闪烁中执行约 15,000 次操作,因此除非您在客户端进行批量正则表达式,否则速度无关紧要。当然,如果布尔结果是您所追求的,那么“测试”在逻辑上是正确的函数。感谢您的问答。
2021-04-11 00:34:56

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

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=

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

这个很重要!疯狂地试图找出为什么所有其他结果都丢失了......供其他发现此结果的人参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ......
2021-03-29 00:34:56
看到我的 regex.test() 随机记录“真”然后“假”然后“真”,我只是头疼……谢谢!
2021-04-02 00:34:56
我认为这是更好的答案。它解释了他们没有给出相同的结果,并且 reg.test() 有一个危险的陷阱。对我来说,这使得 string.match() 成为明确的选择。性能对我来说从来都不是问题。
2021-04-02 00:34:56
如果您和我一样困惑,请参阅stackoverflow.com/q/1520800/3714913还有String.prototype.search(),它返回一个索引,但据我所知没有这个问题。
2021-04-09 00:34:56
只是好奇,拥有一个全球标志有.test()什么意义?不是.test()检查字符串是否具有匹配的正则表达式的重点?
2021-04-12 00:34:56