我目前正在做一段代码,它必须能够匹配一些regexp,并在字符串中做一些与regexp匹配的替换。
为了做到这一点,我在java中使用了匹配器对象。但是,正如您在互联网上看到的那样,所有示例都使用StringBuffer,以便使用附录替换和附录方法(oracleDoc)进行一些替换。
但是当我推送我的代码时,Sonar抱怨说我使用了字符串缓冲区而不是字符串构建器。
显然,有些开发人员抱怨那个这里。
我找到了一种不使用StringBuffer和StringBuilder的方法,但我确信这并不像使用StringBuffer那样有效(而且可能是一种糟糕的实践)。您可以在junit中复制粘贴,测试下面的示例代码:
String entry = "Actual 4.11-6 and 13-5";
String expectedReturn = "Actual 4*11^(-6) and 13^(-5)";
String number = "(^|\\s)-?\\d+((\\.||,)\\d+){0,1}(.\\d+){0,1}-\\d+";
Pattern pattern = Pattern.compile(number);
Matcher matcher = pattern.matcher(entry);
//USING STRING BUFFER
StringBuffer stringBuffer = new StringBuffer();
String substring;
while(matcher.find()){
substring = matcher.group(0);
matcher.appendReplacement(stringBuffer,substring.replace(".","*").replace("-","^(-")+")");
}
matcher.appendTail(stringBuffer);
//USING STRING BUILDER
matcher = pattern.matcher(entry);
int lastIndex = 0;
StringBuilder stringBuilder = new StringBuilder();
while(matcher.find()){
stringBuilder.append(entry.substring(lastIndex,matcher.start()));
substring = matcher.group(0);
stringBuilder.append(substring.replace(".","*").replace("-","^(-")+")");
lastIndex = matcher.end();
}
stringBuilder.append(entry.substring(lastIndex,entry.length()));
Assert.assertEquals(expectedReturn,stringBuffer.toString());
Assert.assertEquals(expectedReturn,stringBuilder.toString());信息:管理用于追加的字符串生成器的匹配器将在jdk 9 源代码和代码评审中。
发布于 2016-08-10 15:33:39
这是警告,不是错误。声纳做了它的工作警告你,StringBuilder是更好的因为它更快。如果API强制您使用StringBuffer,那么我将使用它并沉默警告。
我认为Pattern和两个缓冲区的真正根本问题是,StringBuffer和StringBuilder没有共享用于构建字符串的特定接口(Appendable是一个更通用的接口,我认为它们应该共享一个更特定的接口,用于构造字符串,比如StringConstructor),这将允许您以零工作(通常)来切换实现。
https://stackoverflow.com/questions/38877546
复制相似问题