Manipulação de strings – Alguma outra maneira eficiente?

Eu tinha um requisito onde eu preciso inserir uma seqüência de escape em uma determinada variável de seqüência de caracteres, em lugares onde uma única aspas (‘) aparece. Eu tentei usar o método split e também o StringTokenizer , nenhum dos dois funcionou para mim. Então eu desenvolvi a lógica abaixo mencionada. Ele também falha em alguns cenários

Alguém pode me fornecer uma maneira mais simples de atingir essa exigência.

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

que tal agora:

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

Ou eu entendo mal sua exigência?


E sobre as discussões nos comentários: sim, replace() e replaceAll() usam Expressões Regulares usam Padrões compilados internamente (mas replace() usa o sinalizador Pattern.LITERAL ), interpretando o padrão como valor literal, enquanto replaceAll() (e replaceFirst() ) ambos usam expressões regulares. No entanto, os padrões compilados são absolutamente idênticos (neste caso). Tente você mesmo:

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

Adicione um ponto de interrupção após essas atribuições e dê uma olhada nesses dois padrões compilados. Você verá que todos os seus valores de campo são idênticos, portanto, neste caso, pelo menos, não faz diferença alguma no desempenho.

Use o método replaceAll :

 myString.replaceAll("'", "\\'"); 

Eu usaria um object StringBuilder em vez de concatenar manualmente as strings. Pelo menos você obteria alguma melhora no desempenho se as suas strings fossem grandes.

 message = message.replaceAll("'", ""); 
 String in = ... StringBuilder out = new StringBuilder(in.length() + 16); for (int i=0; i