2016-10-04 31 views
0

新しい行(\ n)、タブ(\ t)とエスケープ文字\を与えれば、どのように文字列フォーマットを与えることができますか?文字を適切にエスケープします。例1:Java - 適切な文字列をエスケープシーケンスとエスケープ文字に変換する

"string \\t \t" 

出力は次のようになります。

"string \t " 

したがって、この場合には、\\ tはタブ

例2でフォーマットされているだけトンと\トンを\にエスケープされています。

"string \\t \n \\n" 

出力は次のようになります。

"string \t 
\n" 

私は解決策を強要しましたが、バックスラッシュを使ってタブとスペースを区切る際に問題が発生しているため、解決策はありませんでした。私は最初の例を通じてそのコードを実行した場合

String v= "..." //v for value 
v = v.replace("\\\"","\""); 
v = v.replace("\\\\","\\"); 
v = v.replace("\\t", " "); 
v = v.replace("\\n", "\n"); 
v = v.replace("\\\t", "\\t"); 
v = v.replace("\\\n", "\\n"); 

それは与えるだろう:あなたがしようとしなかった

"string   " 
+0

'' \\ ''バックスラッシュのエスケープです。 '' \ n''は改行のためのエスケープです。 '' \ t''はタブ文字のエスケープです。あなたはあなたが解決しようとしていたことを言っていないと言っていますが、どうすればいいですか? – Andreas

+0

'\\ t'を' \ t 'ではなく\ [tab]として評価したいとお考えですか? – Zircon

+0

@Andreas \\はバックスラッシュをエスケープする必要があります。 tまたは\\ nはタブまたは改行でエスケープする必要があります。 – BDillan

答えて

1

は1のように見える「ブルートフォース」の組み合わせが正しい

replace("\\t", "\t") 

すべてを置換する<バックスラッシュ> <> <タブの組み合わせ> "

文字列、それらをすべて一緒に取得する

v = v.replace("\\t", "\t").replace("\\n", "\n") 

は、あなたが最初のシングルスラッシュでエスケープスラッシュを置き換え、その後エスケープシンボルを置換していることができ

1

(自身で\を交換する必要はありません):

[\, \, \, n] -> [\, \, \n] -> [\, \n] 

(^|[^\\])(\\\\)* 

- (^|[^\\]) is the start of the string or not a slash 
- (\\\\)* is slash pairs 

我々は2つのスラッシュのペアの出現を見つけることによってこれを行うことができます

((^|[^\\])(\\\\)*)(\\n) 

その後、我々は、Javaのためにこの文字列をエスケープ:

は、あなたが(\nたとえば)を交換したいのシンボルと組み合わせる

((^|[^\\\\])(\\\\\\\\)*)(\\\\n) 

は今、あなたは、この正規表現のためのヘルパーメソッドを書くことができました最初のグループ$1を維持し、第二群置き換えたとえば

public static String replaceEscapedChar(
    final String source, 
    final char escaped, 
    final char actual 
) { 
    final String replacee = "(\\\\" + escaped + ")"; 
    final String replacement = "$1" + actual; 
    return source.replaceAll("((^|[^\\\\])(\\\\\\\\)*)" + replacee, replacement); 
} 

を。以下は、生成します。

replaceEscapedChar("Test\\\\\\nTest\\\\n", 'n', '\n'); 

Test\\ 
Test\\n 

PSを:あなたはまた、書面により、その後の引用符を削除することができます

source.replaceAll("((\\\\\\\\)+)", "\\\\"); 
関連する問題