这是一个糟糕的正则表达式吗?

时间:2014-10-17 10:04:40

标签: javascript regex

在最近与初级JavaScript开发人员的谈话中,我提到了以下用于减少使用OR操作数的费力的if / else块的技术:

if (/^(cat|dog|horse)$/.test(animal)) { ... }

而不是

if (animal == 'cat' || animal == 'dog' || animal == 'horse') { ... }

我从来没有遇到过这个问题,但是有人认为这是一个糟糕的设计模式,没有详细说明原因。

4 个答案:

答案 0 :(得分:4)

在我看来,他是想要过于聪明的人。并且,在这样做的过程中,您已经引入了几个新的潜在失败点(在正则表达式语法中),并使代码不那么具有表现力/惯用性。如果你的操作数从'cat'变为动态或变量,你也会感到挣扎。

通常,在做这样的事情时,我只是引入一个数组:

if (['cat', 'dog', 'horse'].indexOf(animal) != -1) { ... }

老实说,这是可笑的主观所以没有"对"回答我可以给你。

通常在这一点上我会引入性能问题,但由于需要仅扫描一次输入,因此您实际上可能会有更快的解决方案。这将取决于正则表达式本身的解析速度。

答案 1 :(得分:2)

正则表达方式毫无疑问我更喜欢在这种情况下,而不是感谢有很长的比较列表。表现明智,我认为正则表达式不会比多重比较大得多(想象一下你动物的30-40比较的情况)。

正则表达式还为您提供了其他好处,例如检查忽略大小写匹配或与单词边界进行比较(对于这些情况,当输入是某些文本的一部分时),这将需要额外的代码,否则用于字符串比较。

答案 2 :(得分:1)

构建一个正则表达式比进行一些字符串比较更昂贵,但是如果它使代码更清晰并且性能不受影响(当然通过分析!),那么我觉得它很好。 / p>

答案 3 :(得分:0)

这是基于意见的,但有些要提出的要点是:

代码应该是可读的,而不是非常短。

正则表达式更容易出错,例如:如果忘记了$这将匹配horses

没有文档,有人阅读代码重构代码可能不会有痛苦的目的:

  • 它应该区分动物吗? ^cat|dog|horse$
  • 它应该区分动物数吗? ^cat|dog|horse

添加更多变种可能会有问题,即:

if (animal == 'cat' || animal == 'dog' || animal == someUserInputtedAnimal)

<强>解决方案:

对于许多if语句使用switch或&#34; true&#34;切换:

switch (animal)
{
    case 'cat':
        break;
    case 'dog':
        break;
    case 'horse':
        break;
}

switch (true)
{
    case animal == 'cat':
        break;
    case animal == 'dog':
        break;
    case animal == 'horse':
        break;
    case someRandomAnimal == ressurected:

        break;
}