Javascript regex.test V.S.string.match以了解字符串是否与正则表达式匹配
很多时候,我使用stringJavascript regex.test V.S.string.match以了解字符串是否与正则表达式匹配,javascript,regex,performance,Javascript,Regex,Performance,很多时候,我使用stringmatch函数来了解字符串是否与正则表达式匹配 if(str.match(/{regex}/) 这两者之间有什么区别吗: if(/{regex}/.test(str)) 它们似乎给出了相同的结果?基本用法 首先,让我们看看每个函数的作用: regexObject.(字符串) 执行正则表达式和指定字符串之间匹配的搜索。返回true或false 字符串。(RegExp) 用于在将字符串与正则表达式匹配时检索匹配项。返回具有匹配项的数组,如果不存在匹配项,则返回null
match
函数来了解字符串是否与正则表达式匹配
if(str.match(/{regex}/)
这两者之间有什么区别吗:
if(/{regex}/.test(str))
它们似乎给出了相同的结果?基本用法
首先,让我们看看每个函数的作用:
regexObject.(字符串)
执行正则表达式和指定字符串之间匹配的搜索。返回true或false
字符串。(RegExp)
用于在将字符串与正则表达式匹配时检索匹配项。返回具有匹配项的数组,如果不存在匹配项,则返回null
由于null
的计算结果为false
if ( string.match(regex) ) {
// There was a match.
} else {
// No match.
}
演出 在性能方面有什么不同吗 是。我在以下文件中找到了这张简短的便条: 如果需要知道字符串是否与正则表达式regexp匹配,请使用regexp.test(string) 差异显著吗 答案再次是肯定的!我把这些信息放在一起,可以看出差异在~30%-~60%之间,具体取决于浏览器: 结论
如果想要更快的布尔检查,请使用
.test
。使用.match
在使用g
全局标志时检索所有匹配项。不要忘记在regexp中考虑全局标志:
var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi'); // => true
reg.test('abcdefghi'); // => false <=
var reg=/abc/g;
!!'匹配(reg);//=>真的
!!'匹配(reg);//=>真的
注册测试('abcdefghi');//=>真的
注册测试('abcdefghi');//=>false这些是@ajax333221中最好的测试。谢谢你的jsperf,但我不确定它是否好。正则表达式使用匹配组进行匹配,这在查找布尔值时是不需要的。这并不奇怪,因为字符串函数需要翻转对象,然后在存在匹配的情况下创建数组。看起来我将继续使用.test()
:)我的两分钱:性能被高估了。任何一个选项都可以在监视器的闪烁中执行约15000个操作,因此除非您在客户端执行批量regex,否则速度是不相关的。当然,“test”在逻辑上是正确的函数,如果您所追求的是布尔结果。谢谢你的问答。有趣的是,对于我来说,使用上面的jsPerf测试(Chrome 41,OSX)比测试慢41%。@AlexShilman indexOf比根据这个测试快(但不多)(你会期望它会更快)。有一件事可能会咬到你(它最近咬了我的团队):如果您在正则表达式上使用“g”标志并创建一个新实例(即通过new RegExp(,“g”))并重用该实例,则运行“test”是有状态的,即在多次运行时将返回不同的结果。请参阅了解详细信息。我刚刚看到我的regex.test()随机记录了“true”然后“false”然后“true”…谢谢!我认为这是更好的答案。它解释了它们不会给出相同的结果,并且reg.test()有一个危险的陷阱。对我来说,这使得string.match()成为一个明确的选择。性能对我来说从来都不是什么问题。这很重要!疯狂地试图找出为什么其他所有结果都不见了……供其他发现这一点的人参考:如果你和我一样困惑,请看。还有一个,它返回一个索引,但据我所知没有这个问题。只是好奇,为.test()
设置一个全局标志有什么意义?.test()
检查字符串是否有匹配的regexp,这不是重点吗?