regex.test V.S. string.match to know if a string matches a regular expression
很多时候,我使用字符串match函数来判断字符串是否与正则表达式匹配。
1
| if(str.match(/{regex}/)) |
这两者有什么区别吗?
1
| if (/{regex}/.test(str)) |
号
他们似乎给出了同样的结果?
- 这些是最好的测试,您可以找到jspef.com/regexp-test-vs-match-m5
- @Ajax333221。谢谢你的JSPERF,但我不确定它是否是一个好的。regex使用匹配组进行匹配,这在查找布尔值时不需要。
基本用法
首先,让我们看看每个函数的作用:
regexobject.test(字符串)
Executes the search for a match between a regular expression and a specified string. Returns true or false.
号
字符串匹配(regexp)
Used to retrieve the matches when matching a string against a regular expression. Returns an array with the matches or null if there are none.
号
由于null评价为false,
1 2 3 4 5
| if ( string.match(regex) ) {
// There was a match.
} else {
// No match.
} |
性能
性能方面有什么不同吗?
对。我在MDN网站上找到了这个简短的留言:
If you need to know if a string matches a regular expression regexp, use regexp.test(string).
号
差异是否显著?
答案是肯定的!我把这个jspef放在一起,根据浏览器的不同,它的差别是~30%-~60%:
。
结论
如果需要更快的布尔检查,请使用.test。当使用g全局标志时,使用.match检索所有匹配项。
- 不太奇怪,因为字符串函数需要翻转东西,然后在匹配的情况下创建数组。看来我会继续使用.test()。:)
- 对于实际提取值的性能如何……另外,为什么不在for.exec()中抛出第三个事例呢?
- @利文斯顿机械,因为这不是邮报的主题。
- 我的2分:性能被高估了。任何一个选项都可以在监视器闪烁时执行大约15000个操作,因此除非您正在执行批量regex客户端,否则速度与此无关。当然,"测试"在逻辑上是正确的函数,如果布尔结果就是你想要的结果。谢谢你的问答。
- 那么test()和indexof()呢?
- 有趣的是,使用上面的JSPerf测试(chrome 41,osx),测试比匹配测试慢41%。
- @本杰相似的结果:在铬42,OSX上测试比我慢21%(&177;4次测试慢3%)。
- @根据stackoverflow.com/questions/183496/&hellip,AlexShilman indexof比test更快(但不多),(您会期望它更快)。
- .match()不适合我,因为我在.test()中使用了相同的regex,可能是拼写错误,不知道。
- 在字符串中搜索的另一个性能注意事项:stackoverflow.com/questions/5296268/…
不要忘记在regexp中考虑全局标志:
1 2 3 4 5
| var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi'); // => true
reg.test('abcdefghi'); // => false <= |
号
这是因为当找到新的匹配项时,regexp会跟踪lastindex。
- 我刚才看到我的regex.test()随机记录了"真"和"假",然后是"真"…谢谢!
- 我认为这是更好的答案。它解释了它们不能给出相同的结果,并且reg.test()有一个危险的陷阱。对我来说,这使得string.match()成为了明确的选择。性能对我来说从来都不是问题。
- 这很重要!疯狂地想弄清楚为什么其他结果都不见了……以供其他人参考:developer.mozilla.org/en-us/docs/web/javascript/reference/&hellip;
- 如果您和我一样困惑,请参阅stackoverflow.com/q/1520800/3714913。还有string.prototype.search(),它返回一个索引,但据我所知没有这个问题。
- FML!我浪费了半天的时间来做这些全球旗帜的事情…
- 只是好奇,为.test()设置一个全球标志有什么意义?.test()的点不是用来检查字符串是否有匹配的regexp吗?
- 测试(…)不应该在regexp上设置全局标志,除非您正在查找一组希望计算匹配项的文本。