2017-01-13 9 views
-1

eclipseで実行コンフィギュレーションを通じてenvirinment変数として変数を渡すと、自動的に特殊文字がエスケープされます。私はいくつかの書式設定のために '\ n'と '\ r'文字を渡したいと思いますが、これらは自動的に '\\ n'と '\\ r'として変換されます。したがってJava渡し環境変数が自動的に特殊文字をエスケープする

String value= System.getenv("envPassed"); 
System.out.println("envPassed= "+value); 

envPassedはそれが

hi\n\rhello 

として印刷 'HI \\ N \\ R' および出力として変換され、実行構成において 'N \ HI \ rhello' として与えられている場合出力は

となるはずです
hi 
hello 

これを動作させる方法はありますか?

+1

これは「変換された」という用語の奇妙な使い方のようです。私が見る限り、何も変換されていないので、変数定義として 'hi \ n \ rhello'を挿入し、' hi \ n \ rhello'を含む文字列を得ました。 – Holger

+0

真剣に!!私のダブルバックスラッシュをここでもシングルに変換していました。私は2つのスラッシュとして表示するためにもう1つのバックスラッシュを追加しました – sunder

+1

出力は2行として出力されません。それは 'hi \ n \ rhello'として表示されます。あなたはバックスラッシュを提供し、バックスラッシュを取得しました。あなたはあなたが提供したものを正確に戻しました。変換なし。これらのエスケープシーケンスを行終了文字に変換するJavaの唯一のものは、文字列リテラル上で動作するJavaコンパイラであり、このプロセスには関係しません。注:キャリッジリターンは改行の前に置く必要があります。 – EJP

答えて

2

\nおよび\rのようなシーケンスは、JavaソースコードのStringリテラルのように、そのような動作が文書化されている場所に入力すると制御文字に変換されます。

環境変数または文字列置換のEclipseダイアログでは、このような変換は実行されませんが、入力されたとおりに文字列が転送されます。これは、Javaプログラムが環境変数の値を読み取って印刷することが、入力したものを正確に表示するという事実によって示されています。

これはJava Debuggerの特別なプロパティで、検査時に相当するJavaソースコードのリテラルのような内容を表示します。これはコンバージョンが発生する唯一の場所です。

これらの変数に対して複数行の文字列をサポートすることは、Eclipse開発者の意図ではないようです。彼らは主にパス文字列などを対象としているようです。しかし、私はあなたに改行を挿入する方法を見つけました。 ${system_property:line.separator}を使用すると、line.separatorというJavaシステム・プロパティー(list of always present system properties)が読み取られます。

-1

あなたはいつもそれを操作する前に、文字列を前処理することができます...あなたは、これは常にあまりにも動作することを確認するために、正規表現の少しを使用することができ、安全にしたい場合:

String value = System.getenv("MyEnv"); 
if (value != null) { 
    value.replaceAll("\\\\n(\\\\r)?", "\n"); 
} 
System.out.println(value); 

ますのでご注意くださいString.replaceAll()は文字列と正規表現の両方としてパターン文字列を解釈するため、これは必要です。

希望すると便利です。

関連する問題