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


286

match经常使用字符串函数来知道字符串是否与正则表达式匹配。

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

之间有什么区别:

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

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


4
这些是最好的测试,您会找到jsperf.com/regexp-test-vs-match-m5
ajax333221 2012年

@ ajax333221。感谢您的jsperf,但我不确定这是一个不错的选择。使用匹配组进行正则表达式匹配,查找布尔值时不需要。
gdoron支持Monica 2012年

Answers:


439

基本用法

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

regexObject测试字符串

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

字符串匹配RegExp

将字符串与正则表达式匹配时,用于检索匹配项。返回具有匹配项或null没有匹配项的数组。

由于null评估为false

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

性能

在性能方面有什么区别吗?

是的。我在MDN网站上找到了此简短说明:

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

差异是否显着?

答案再一次!这个jsPerf我放在一起的显示,差异取决于浏览器为 %%

测试与比赛|  性能测试

结论

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


5
不太惊讶,因为字符串函数需要翻转内容,然后在匹配时创建Array。看来我会继续使用.test()。:)

22
我的两分钱:表现被高估了。任一个选项都可以在监视器的闪烁中进行约15,000次操作,因此,除非您在客户端进行批量正则表达式,否则速度是无关紧要的。当然,如果您追求的是布尔结果,那么从逻辑上讲,“测试”是正确的函数。感谢您的问/答BTW。
大卫·吉尔伯森

2
有趣的是,测试速度比使用上述jsPerf测试(Chrome 41,OSX)的速度慢41%。
本杰

1
@AlexShilman indexOf比根据此stackoverflow.com/questions/183496/…的测试要快(但不多)(您希望它会更快)。
播客

1
在这里可能会伤到您的一件事(最近它对我的团队造成了伤害):如果您在Regex上使用'g'标志并创建一个新实例(即通过新的RegExp(<regex_str>,'g')),然后重用该对象例如,运行“测试”是有状态的,即多次运行将返回不同的结果。有关详细信息,请参见developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/…
davertron '19

118

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

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

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


21
我只是一头撞到看到我的regex.test()随机记录了“ true”,然后是“ false”,然后是“ true” ...谢谢!
adriendenat 2014年

7
我认为这是更好的答案。它说明了它们给出的结果不同,并且reg.test()有一个陷阱。对我来说,这使string.match()成为明确的选择。对我而言,性能从来都不是问题。
詹姆斯

2
这个很重要!快要疯了试图找出为什么每隔结果失踪......为别人的引用,认为本:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...

2
如果您像我一样困惑,请参阅stackoverflow.com/q/1520800/3714913。还有String.prototype.search(),它返回一个索引,但据我所知没有这个问题。
Nateowami

3
只是好奇,拥有全局标志的意义.test()何在?是不是.test()要检查字符串是否具有匹配的正则表达式?
buhbang

0

这是我的基准测试结果 基准结果

测试4,267,740 ops / sec±1.32%(采样了60个运行)

执行3,649,719 ops / sec±2.51%(60次运行采样)

匹配3,623,125 ops / sec±1.85%(62次运行采样)

指数6,230,325 ops / sec±0.95%(62次运行采样)

测试方法比匹配方法快,但是最快的方法是indexOf


indexOf不适用于正则表达式,因此无关紧要。
gdoron支持Monica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.