什么是更快,正则表达式或比较 - Java

时间:2014-01-10 19:21:29

标签: java regex performance if-statement

我有两种可能性,制作正则表达式或进行if比较。

如果比较

if (!(modoImpressao.equals("IMPRESSORA") || 
   modoImpressao.equals("PDF") || modoImpressao.equals("AMBOS")))

正则表达式匹配

if (!Pattern.compile("(IMPRESSORA)|(PDF)|(AMBOS)",Pattern.DOTALL).matcher(modoImpressao).find()){
            throw new EspdNeverStopParametroInvalidoException(TspdConstMessages.IMPRIMIR_PARAMETRO_MODOIMPRESSAO_INVALIDO,"TspdImprimirNFCe");
        }

哪一个更快?

2 个答案:

答案 0 :(得分:12)

第一个片段几乎肯定会更快,因为它不需要解析正则表达式并对其执行匹配。另一种选择是:

if (Arrays.asList("IMPRESSORA", "PDF", "AMBOS").contains(modoImpressao)

与第一段代码的速度差别不大,但可以说更具可读性和简洁性。

正则表达式很棒,但只在需要时使用它们。这种情况绝对不能保证使用正则表达式;你正在做的就是与文字字符串进行比较。

Jamie Zawinski有一句古老的说法是这样的:

  

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

答案 1 :(得分:2)

如果您只使用正则表达式一次,则可能会更慢,尤其是当您在问题中使用find时实际意味着matches时。

当您保留已编译的Pattern并多次使用它时,它有可能比多个等于更快。

然而,这取决于具体情况。如果您正在测试的所有String都是文字并且匹配更有可能失败,那么String.equals会更快,因为如果实例是相同的,它将在电路上进行测试。


最快的解决方案是根据候选String的易于检查的属性进行预选,该属性对于所有String是不同的,例如char位于特定位置或length,并为所选equals执行一次String。在你的情况下,第一个字符和长度都是合适的。在这种情况下,我更喜欢长度,因为在访问角色之前必须检查长度以防止空Strings

使用length的首选变体:

nomatch:
{
  switch(modoImpressao.length())
  {
    case 3: if(modoImpressao.equals("PDF")) break nomatch; break;
    case 5: if(modoImpressao.equals("AMBOS")) break nomatch; break;
    case 10: if(modoImpressao.equals("IMPRESSORA")) break nomatch; break;
  }
  throw new EspdNeverStopParametroInvalidoException(
    TspdConstMessages.IMPRIMIR_PARAMETRO_MODOIMPRESSAO_INVALIDO,
    "TspdImprimirNFCe");
}
// one of the three values matched

使用第一个char的变体:

nomatch:
{
  if(modoImpressao.length()>0) switch(modoImpressao.charAt(0))
  {
    case 'P': if(modoImpressao.equals("PDF")) break nomatch; break;
    case 'A': if(modoImpressao.equals("AMBOS")) break nomatch; break;
    case 'I': if(modoImpressao.equals("IMPRESSORA")) break nomatch; break;
  }
  throw new EspdNeverStopParametroInvalidoException(TspdConstMessages.IMPRIMIR_PARAMETRO_MODOIMPRESSAO_INVALIDO,"TspdImprimirNFCe");
}
// one of the three values matched