正则表达式测试VS string.match 知道一个字符串是不是匹配一个正则表达式
Posted
技术标签:
【中文标题】正则表达式测试VS string.match 知道一个字符串是不是匹配一个正则表达式【英文标题】:regex.test V.S. string.match to know if a string matches a regular expression正则表达式测试VS string.match 知道一个字符串是否匹配一个正则表达式 【发布时间】:2012-06-11 23:58:27 【问题描述】:很多时候我使用字符串match
函数来了解字符串是否匹配正则表达式。
if(str.match(/regex/))
这有什么区别:
if (/regex/.test(str))
他们似乎给出了相同的结果?
【问题讨论】:
这些是你会发现的最好的测试jsperf.com/regexp-test-vs-match-m5 @ajax333221。感谢 jsperf,但我不确定它是否好。使用匹配组的正则表达式匹配,在查找布尔值时不需要。 【参考方案1】:基本用法
首先,让我们看看每个函数的作用:
regexObject.test(字符串)
执行正则表达式和指定字符串之间的匹配搜索。返回 true 或 false。
字符串.match(RegExp)
用于在将字符串与正则表达式匹配时检索匹配项。返回包含匹配项的数组,如果没有则返回
null
。
由于null
的计算结果为false
,
if ( string.match(regex) )
// There was a match.
else
// No match.
性能
在性能方面有什么不同吗?
是的。我在MDN site找到了这个简短的说明:
如果您需要知道字符串是否匹配正则表达式 regexp,请使用 regexp.test(string)。
差异显着吗?
答案再次是YES!这个 jsPerf 我放在一起显示差异是 ~30% - ~60% 取决于浏览器:
结论
如果您想要更快的布尔检查,请使用.test
。使用 g
全局标志时,使用 .match
检索所有匹配项。
【讨论】:
不要太惊讶,因为字符串函数需要翻转事物,然后在匹配时创建数组。看来我会继续使用.test()
。 :)
我的两分钱:性能被高估了。任何一个选项都可以在显示器闪烁的情况下执行约 15,000 次操作,因此除非您在客户端执行批量正则表达式,否则速度无关紧要。当然,如果布尔结果是您所追求的,那么“测试”在逻辑上是正确的功能。感谢您的 Q/A BTW。
有趣的是,使用上面的 jsPerf 测试(Chrome 41,OSX)对我来说,测试比匹配慢 41%。
@AlexShilman indexOf 比根据 ***.com/questions/183496/… 进行的测试更快(但不多)(你会期望它更快)。
这里可能会咬你的一件事(它最近咬了我的团队):如果你在 Regex 上使用 'g' 标志并创建一个新实例(即通过 new RegExp(不要忘记在你的正则表达式中考虑全局标志:
var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi'); // => true
reg.test('abcdefghi'); // => false <=
这是因为 Regexp 在找到新匹配项时会跟踪 lastIndex。
【讨论】:
看到我的 regex.test() 随机记录“true”然后是“false”然后是“true”...谢谢! 我认为这是更好的答案。它解释说他们没有给出相同的结果,并且 reg.test() 有一个危险的陷阱。对我来说,这使得 string.match() 成为明确的选择。性能对我来说从来都不是问题。 这很重要!疯狂地试图找出为什么所有其他结果都丢失了......供其他发现此问题的人参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 如果你和我一样困惑,请参阅***.com/q/1520800/3714913。还有String.prototype.search(),它返回一个索引,但据我所知没有这个问题。 只是好奇,为.test()
设置一个全局标志有什么意义? .test()
不是检查字符串是否有匹配的正则表达式吗?以上是关于正则表达式测试VS string.match 知道一个字符串是不是匹配一个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章