检查字符串是否需要调用 String.replaceAll() 与调用它

Checking if a string needs to call String.replaceAll() vs calling it

抱歉,如果标题是 misleading/bad,我不确定如何表达这个问题。

我有多个字符串列表,其中大部分都包含我需要用来替换字符串的参数。其中一些字符串(在列表中)将包含多个要替换的参数。

Comp Status `%compname`
Comp SLA `%rackname` `%sgname` `%compname`

我需要用字符串替换坟墓 `%----` 中的任何内容,这取决于 for 循环中的位置。

我的问题是,我应该检查字符串以查看它是否具有我需要切换的这些参数之一,还是应该只调用每个字符串上的所有 replaceAll() 语句。

1.

for(String s: rackStr){
    newString = new String[1];                
    s = s.replaceAll("`%rackname`", rName);
    s = s.replaceAll("`%compname`", compName);
    s = s.replaceAll("`%sysname`", sysName);
    newString[0] = s;
    System.out.println(newString[0]);
    vars.add(newString);
}

2.

for(String s: rackStr){
    newString = new String[1];       
    if(s.contains("`%rackname")){         
        s = s.replaceAll("`%rackname`", rName);
    }
    if(s.contains("`%compname")){         
    s = s.replaceAll("`%compname`", compName);
    }

    if(s.contains("`%sysname")){         
        s = s.replaceAll("`%sysname`", sysName);
    }

    newString[0] = s;
    System.out.println(newString[0]);
    vars.add(newString);
}

注意我必须使 newString 成为一个数组,并将其添加到 List vars 中,这样我就可以通过 OpenCSV writeAll();

将整个 vars 变量写入 CSV 文件

那么我应该使用 1 还是 2?或者有什么不同?

首先,如果您不使用正则表达式来定义要替换的值,则不应调用 replaceAll(在您的情况下,它们显然是常量值,因此无需抽象模式定义)。

改用replace(它替换找到的所有匹配项)。

它将在内部调用 Matcher#replaceAll,但使用代表您要替换的字段的常量值。

在调用 replace 之前调用 contains 没有多大意义,因为您会解析 String 两次。

如果 String 不包含要替换的术语,则不会抛出异常:它只是不会替换它。

您还可以链式调用来获得一些养眼效果:

s = s
    .replace("`%rackname`", rName)
    .replace("`%compname`", compName)
    .replace("`%sysname`", sysName);

首选第一种方式,因为你不需要首先检查它是否包含天气。我想把 3 行写成一行

s = s.replaceAll("`%rackname`", rName).replaceAll("`%compname`", compName).replaceAll("`%sysname`", sysName);

简单的事实是,这取决于。

检查本身有开销,但替换不是免费的。

如果您有很多不同的参数,那么在某些时候,准确地解析出哪些参数比盲目地应用它们会更便宜,因为大多数人可能不会应用。

如果您的字符串特别长,这样也可以避免不必要地重复解析字符串。

最有效的技术是在流中进行,只解析一次字符串,并在出现时应用替换。

但是对于一些短字符串的 3 个参数,简单的暴力替换虽然在运行时不是最有效的,但在开发和维护方面要高效得多。运行时效率的差异可能不足以影响应用程序。