Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串操作-还有其他有效的方法吗?_Java_String - Fatal编程技术网

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();