2011-02-03 13 views
3

一重引用符( ')が現れる場所で、指定した文字列変数にエスケープシーケンスを挿入する必要があるという要件がありました。私は分割メソッドと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; 
} 

答えて

7

どのようにこれについて:

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

または私はあなたの条件を誤解しますか?


やコメントでの議論について

:使用コンパイルパターン内部はい、両方 replace()replaceAll() 使用正規表現replaceAll()(およびreplaceFirst()のに対し、リテラル値としてパターンを解釈する、(しかしreplace()フラグPattern.LITERALを使用しています) )はどちらも正規表現を使用します。ただし、コンパイルされたパターンは完全に同一です(この場合)。

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

これらの割り当ての後にブレークポイントを追加し、これらの2つのコンパイルされたパターンを詳しく見てください。フィールド値がすべて同じであることがわかります。この場合少なくともパフォーマンス面で違いはありません。

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

うん..私はそれを得た。.. !!! –

+0

これはすべての引用符を置き換えるか、最初の引用符を置き換えます。 –

+0

すべて。 'replaceAll()'との唯一の違いは、正規表現を使用せず、単純な文字列の再補完です。 –

1

replaceAllメソッドを使用します。文字列が大きければ、少なくともパフォーマンスの向上が得られます。

+1

いいえ、 'replaceAll()'は使わず、 'replace()'を使ってください。 'replaceAll()'は正規表現を内部的に使用しますが、この場合はまったく必要ありません。 –

+0

@Sean素晴らしい点。 CharSequenceよりも複雑なものを検索する必要がある場合を除き、 'replace'を使用してください。 – earldouglas

+0

@Sean私は 'replace'と' replaceAll'の両方を10^12回実行しようとしましたが、それらは同じ性能を持っているようです。私はそれを間違ってやっているのですか? – earldouglas

1

私はむしろ手動で文字列をconcatinatingよりも、StringBuilderオブジェクトを使用します。

1
message = message.replaceAll("'", ""); 
+0

のアップデートをもう一度見てください、 'replaceAll()'は過剰です、Jamesの答え –

1
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(); 
+0

の下で私のコメントを見てください。 –

+0

乱数(16)の正当性は、StringBuilderが '文字の1つまたは2つのインスタンスだけで大きな文字列の再割り当てを行う可能性が低いことを保証することです。特定のアプリケーションについてもっとよく知っている場合は、これを削除するか、変更する必要があります。 – gubby

+0

彼は効率的な実装を要求したので、Verboseとreplace()とreplaceAll()メソッドは両方ともその場でコンパイルされたパターンを使用します。 – gubby

関連する問題