Java 字符串操作-还有其他有效的方法吗?
我需要在给定的字符串变量中插入一个转义序列,在出现单引号的地方。我尝试了使用拆分方法和字符串标记器,但两种方法都不适合我。所以我开发了下面提到的逻辑。它在一些情况下也会失败 有谁能给我一个最简单的方法来达到这样的要求吗Java 字符串操作-还有其他有效的方法吗?,java,string,Java,String,我需要在给定的字符串变量中插入一个转义序列,在出现单引号的地方。我尝试了使用拆分方法和字符串标记器,但两种方法都不适合我。所以我开发了下面提到的逻辑。它在一些情况下也会失败 有谁能给我一个最简单的方法来达到这样的要求吗 public static String quotesMessage(String message){ String newMessage=""; while(message.length()>0){ if(message.indexOf("
public static String quotesMessage(String message){
String newMessage="";
while(message.length()>0){
if(message.indexOf("'")==0){
if(!StringUtils.isEmpty(message.substring(0))){
message = message.substring(1);
}
}else{
if(message.indexOf("'")!= -1){
newMessage=newMessage+message.substring(0,message.indexOf("'"))+"\\'";
message=message.substring(message.indexOf("'"));
}else{
newMessage=newMessage+message;
message="";
}
}
}
return newMessage;
}
这个怎么样:
newMessage.replace("'", "\\'")
还是我误解了你的要求
关于评论中的讨论:是的,
replace()
和replaceAll()
都使用正则表达式在内部使用编译模式(但是replace()
使用标志),将模式解释为文本值,而replaceAll()
(和replaceFirst()
)都使用正则表达式。但是,编译后的模式是完全相同的(在本例中)。你自己试试吧:
Pattern literal = Pattern.compile("'",Pattern.LITERAL);
Pattern regular = Pattern.compile("'");
在这些赋值之后添加一个断点,并仔细查看这两个编译模式。您会发现它们的所有字段值都是相同的,因此在这种情况下,至少不会对性能造成任何影响。使用
replaceAll
方法:
myString.replaceAll("'", "\\'");
我会使用StringBuilder对象,而不是手动关联字符串。如果字符串很大,至少可以从中获得一些性能改进。
String in=。。。
message = message.replaceAll("'", "");
StringBuilder out=新的StringBuilder(in.length()+16);
对于(int i=0;iNo,不要使用replaceAll()
,请使用replace()
replaceAll())
在内部使用正则表达式,这在本例中是完全不必要的。@肖恩说得很好。除非您需要搜索比CharSequence
更复杂的内容,否则请使用replace
和replaceAll
10^12次,它们的性能似乎相同e、 我做错了吗,还是它们的性能确实相当好?@James正则表达式引擎当然是高度优化的,你可能需要更多的数字才能注意到这一差异。现在机器速度非常快:-)@Sean根据这个(),replaceAll
要快一点。同样,replaceAll()
也太快了,请参阅我在詹姆斯回答下的评论,该评论将替换所有引用,或者将替换第一个引用。?全部。与replaceAll()
的唯一区别在于它不使用正则表达式,而是使用简单的字符串replecement。太好了。。即使我传递了一组连续的引号,它也能工作@jgubby true,但replace()使用Pattern.LITERAL:@Sean感谢您的详细解释!随机数(16)的合理性是为了确保StringBuilder不太可能对只有一个或两个“字符”实例的大字符串进行重新分配。如果您更了解您的特定应用程序,您应该删除或更改它。Verbose,因为他要求高效的实现,而String replace()和replaceAll()方法都使用当场编译的模式。@Sean Patrick Floyed为什么这样做“正确”而不是String replace/replaceAll?为了证明在上述更简单的方法中使用此方法的合理性,需要一个性能概要文件,该文件显示了IMHO的好处(并在适当的上下文中进行了分析)。可能有优势,也可能没有优势。
String in = ...
StringBuilder out = new StringBuilder(in.length() + 16);
for (int i=0; i<in.length(); i++) {
char c = in.charAt(i);
if (c == '\'') {
out.append("\\'");
} else {
out.append(c);
}
}
String result = out.toString();