2017-01-13 8 views
-1

Если я передаю некоторую переменную переменной envirinment через конфигурацию запуска в eclipse, она автоматически ускользает от специальных символов. Я хочу передать некоторые символы «\ n» и «\ r» для некоторого форматирования, но они автоматически преобразуются как «\\ n» и «\\ r», когда я проверяю его значение в коде путем отладки.Переменная среды передачи Java автоматически вытесняет специальные символы

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

Так что, если envPassed дается как «привет \ п \ rhello» в конфигурации Run, то он будет преобразован в «привет \\ п \\ г» и выход печатной, как

hi\n\rhello 

тогда как выход должен составлять

hi 
hello 

Есть ли у нас какой-то способ заставить его работать?

+1

Это, по-видимому, странное использование термина «преобразованный». Насколько я вижу, ничего не было преобразовано вообще, вы вставили 'hi \ n \ rhello' в качестве определения переменной и получили строку, содержащую' hi \ n \ rhello'. – Holger

+0

серьезно !!, это даже конвертировало мою двойную обратную косую черту и здесь. Я добавил еще одну обратную косую черту, чтобы показать ее как 2 слэша – sunder

+1

Выход должен * не * быть напечатан как две строки. Его следует печатать как 'hi \ n \ rhello'. Вы предоставили обратную косую черту, вы получили обратную косую черту. Вы вернули именно то, что вы предоставили. Нет конверсии. Единственное, что в Java, которое переводит эти escape-последовательности в символы завершения строки, это компилятор Java, работающий на строковых литералах, и он не участвует в этом процессе. NB Возврат каретки должен предшествовать подаче линии. – EJP

ответ

2

Последовательности, подобные \n и \r, преобразуются только в управляющие символы, когда вы вводите их там, где такое поведение документировано, например, для String литералов в исходном коде Java.

Диалоги Eclipse для переменных среды или подстановки строк не выполняют такое преобразование, а переносят строку как введенную. Это иллюстрируется тем фактом, что ваша программа Java, просматривающая и печатая значение переменной окружения, печатает именно то, что вы ввели.

Это специальное свойство Java Debugger для отображения содержимого String, аналогичного эквивалентному литералу на языке Java, после проверки. Это единственное место, где происходит конверсия.

Это не похоже на намерение разработчика Eclipse поддерживать многострочные строки для этих переменных. Они, похоже, нацелены в первую очередь на строки пути и тому подобное. Однако я нашел способ, как вы можете вставить разрыв строки. Используйте ${system_property:line.separator}, это будет читать системное свойство Java с именем line.separator, которое находится в 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() интерпретирует строку шаблона как строку, так и регулярное выражение.

Надеюсь, это поможет!