Манипулирование строками - любой другой эффективный способ? - PullRequest
3 голосов
/ 03 февраля 2011

У меня было требование, где мне нужно вставить escape-последовательность в заданную строковую переменную, в местах, где одинарные кавычки (').Я пытался использовать метод split , а также StringTokenizer , но ни один из них не помог мне.Итак, я разработал следующую логику.Это также дает сбой в нескольких сценариях

Может ли кто-нибудь предоставить мне самый простой способ выполнить такое требование .?

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;
}

Ответы [ 5 ]

7 голосов
/ 03 февраля 2011

как насчет этого:

newMessage.replace("'", "\\'")

Или я неправильно понимаю ваше требование?


А по поводу обсуждений в комментариях: да, оба replace() и replaceAll() использовать регулярные выражения внутренне использовать скомпилированные шаблоны (но replace() использует флаг Pattern.LITERAL), интерпретируя шаблон как буквальное значение, тогда как replaceAll()replaceFirst()) оба используютРегулярные выражения.Однако скомпилированные шаблоны абсолютно идентичны (в данном случае).Попробуйте сами:

Pattern literal = Pattern.compile("'",Pattern.LITERAL);
Pattern regular = Pattern.compile("'");

Добавьте точку останова после этих назначений и более внимательно посмотрите на эти два скомпилированных шаблона.Вы обнаружите, что все значения их полей идентичны, поэтому в этом случае, по крайней мере, нет, это не влияет на производительность.

1 голос
/ 03 февраля 2011
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();
1 голос
/ 03 февраля 2011
message = message.replaceAll("'", "");
1 голос
/ 03 февраля 2011

Я бы использовал объект StringBuilder вместо ручного объединения строк.По крайней мере, вы получите некоторое улучшение производительности, если у вас большие строки.

1 голос
/ 03 февраля 2011

Используйте метод replaceAll:

myString.replaceAll("'", "\\'");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...