为什么我应该使用js正则表达式而不是字符串方法,反之亦然?

时间:2015-07-27 20:50:39

标签: javascript regex function

例如,我有字符串' ala bala aladin'。现在,如果我想在单词'aladin'之后检查,我可以使用正则表达式和字符串函数来执行此操作,如下所示:

if( /aladin/g.test('ala bala aladin') ) { ..... }

if( 'ala bala aladin'.indexOf("aladin") !='-1' ) { ..... }

在这种情况下,最好的使用方法是什么?正则表达式或字符串方法?为什么?

5 个答案:

答案 0 :(得分:9)

要么你得到一个结果就好了。对于简单字符串,正则表达式可能更慢,因为正则表达式是它自己的语言,匹配代码不像.indexOf()那么简单。所以,如果你只有一个没有涉及特殊正则表达式字符的直字符串,那么.indexOf()可能会更快。

但是,与所有性能问题一样,如果您真的关心性能,那么您必须确定相关浏览器中的特定情况。并且,在您确实知道实际存在重大性能问题之前,您通常不应该仅仅为了性能而倾向于使用解决方案。

我的指导原则是尽可能简化我的代码以解决所需的问题。为此,我选择使用.indexOf()如果我只是进行直接字符串搜索,并在我实际需要利用正则表达式功能时使用正则表达式。但是.test()也很简单,所以这里确实没有错误的答案。

选择您认为最具可读性的内容。

仅供参考,这是一个快速查看性能差异的jsperf。 Firefox(2x)的巨大差异。 Chrome和IE的差别不大。

操作总体上足够快(我们说的是每秒数百万次操作),这种差异在实践中不太可能引人注意,除非这个操作处于紧密循环中,在这种情况下,正则表达式对象的创建应该是无论如何,在环路之外,它会改变为不同的情况进行测试。

http://jsperf.com/regex-vs-indexof919

enter image description here

答案 1 :(得分:4)

通常,RegEx将比字符串操作稍微慢一些。但除非你在一个非常大的循环中使用它或者做一些性能非常重要的东西,否则最好使用的版本是对你最有意义且最具可读性的版本。

答案 2 :(得分:2)

如果你可以在没有正则表达式的情况下解决,请不要使用正则表达式。

  

正则表达式非常强大,但它们不是   解决每个问题的正确方法。你应该对它们有足够的了解   知道什么时候合适,什么时候解决你的问题,   当他们造成的问题多于他们解决的问题时。

     

有些人在面对问题时会想“我知道,我会   使用正则表达式。“现在他们有两个问题。

     

- Jamie Zawinski,在comp.emacs.xemacs

http://www.diveintopython.net/regular_expressions/summary.html

答案 3 :(得分:1)

你可能想在这里考虑很多事情。性能重要吗?字符串定义明确吗?区分大小写是一个问题吗?字符串中是否会有可选字符?

indexOf()方法速度快但不灵活,所以它只能真正测试与完全匹配。它不能告诉你它匹配了多少次,就在哪里。

如果您正在测试特定字符串,请默认使用正则表达式。这样您以后可以随时添加自定义,例如:

/aladin/i.test(...) // Test in a case-insensitive manner
/aladd?in/i.test(...) // Allow "aladdin" as well

用户输入很少整洁。如果你学会了如何有效地使用正则表达式,你可以非常巧妙地涵盖很多疯狂的边缘情况。

如果您绝对需要速度或位置信息,indexOf()可以让您满意。如果你连续一百万次字面运行这件​​事,我只关心速度。对于任何低于此的东西,差异将是无法估量的。

答案 4 :(得分:0)

就个人而言,我会从可读性的角度使用正则表达式。使用正则表达式而不是将字符串与int进行比较时,更容易理解发生了什么。