正则表达式测试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(字符串)

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

字符串.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(, ' g')) 并且您重用该实例,运行“测试”是有状态的,即多次运行时将返回不同的结果。详情请见developer.mozilla.org/en-US/docs/Web/javascript/Reference/…。【参考方案2】:

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

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 知道一个字符串是不是匹配一个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java - \pL [\x00-\x7F]+ 正则表达式无法使用 String.match 获取非英文字符

JavaScript 正则

返回 Ruby 正则表达式的第一个匹配项

js正则表达式总结之方法层面

正则表达式

String.match(正则 或 'string') 有两种方式