Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript regex.test V.S.string.match以了解字符串是否与正则表达式匹配_Javascript_Regex_Performance - Fatal编程技术网

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

Javascript 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

很多时候,我使用string
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,这不是重点吗?