Заменить обратную косую черту в строке, используя Java / Groovy - PullRequest
1 голос
/ 16 июня 2011

Попытка получить простую замену строки для работы с использованием скрипта Groovy.Пробовал разные вещи, в том числе экранирование строк разными способами, но не могу понять.

String file ="C:\\Test\\Test1\\Test2\\Test3\\"
String afile = file.toString() println
"original string: " + afile
afile.replace("\\\\", "/")
afile.replaceAll("\\\\", "/") println
"replaced string: " + afile

Этот код приводит к:

original string: C:\Test\Test1\Test2\Test3\
replaced string: C:\Test\Test1\Test2\Test3\

----------------------------

Ответ, вдохновленный печалью, выглядит следующим образом:

  // first, replace backslashes
  String afile = file.toString().replaceAll("\\\\", "/")
  // then, convert backslash to forward slash
  String fixed = afile.replaceAll("//", "/")  

Ответы [ 7 ]

7 голосов
/ 16 июня 2011

replace возвращает другую строку. В Java String s нельзя изменить, поэтому вам нужно присвоить результат замены чему-либо и распечатать его.

String other = afile.replaceAll("\\\\", "/")
println "replaced string: " + other

Отредактировано: как указывал Нефтас в комментарии, \ - это специальный символ в регулярном выражении, поэтому его необходимо экранировать дважды.

2 голосов
/ 17 февраля 2017

В Groovy вы даже не можете написать \\ - это «неподдерживаемая escape-последовательность».Итак, все ответы, которые я вижу здесь, являются неправильными.

Если вы имеете в виду одну обратную косую черту, вы должны написать \\\\.Таким образом, изменение обратной косой черты на обычную косую черту будет выглядеть следующим образом:

scriptPath = scriptPath.replaceAll("\\\\", "/")

Если вы хотите заменить пару обратных косых черт, вы должны удвоить усилие:

scriptPath = scriptPath.replaceAll("\\\\\\\\", "/")

Эти строки успешноиспользованный в скрипте Gradle / Groovy, который я намеренно запустил только сейчас еще раз - просто чтобы быть уверенным.

Что еще более забавно, показать эти необходимые восемь обратных слешей \\\\\\\\ "в обычном тексте здесь, на StackOverflow, я должен использовать шестнадцать из них!Извините, я не покажу вам эти шестнадцать, потому что мне нужно 32!И это никогда не закончится ...

2 голосов
/ 16 июня 2011

Если вы работаете с путями, вам лучше использовать объект java.io.File.Он автоматически преобразует указанный путь в правильный путь, зависящий от операционной системы.

Например, (в Windows):

String path = "C:\\Test\\Test1\\Test2\\Test3\\";

// Prints C:\Test\Test1\Test2\Test3
System.out.println(new File(path).getAbsolutePath());

path = "/Test/Test1/Test2/Test3/";

// Prints C:\Test\Test1\Test2\Test3
System.out.println(new File(path).getAbsolutePath());
1 голос
/ 16 июня 2011

1) afile.replace (...) не изменяет строку, по которой вы ее вызываете, просто возвращает новую строку.

2) Входные строки (String file = "C: \\ Test \\ Test1 \\ Test2 \ Test3 \\ ";), с точки зрения Java, содержат только одну обратную косую черту.Первая обратная косая черта является escape-символом, а вторая обратная косая черта говорит, что вы действительно хотите обратную косую черту.

, поэтому

afile.replace("\\\\", "/");
afile.replaceAll("\\\\", "/");

должно быть ...

afile = afile.replace("\\", "/");
afile = afile.replaceAll("\\", "/");
0 голосов
/ 28 апреля 2018

Как найдено здесь , лучшим кандидатом может быть метод static Matcher:

Matcher.quoteReplacement( ... )

Согласно моим экспериментам, это удваивает одиночные обратные слеши. Несмотря на название метода ... и несмотря на слегка загадочный Javadoc: «Косые черты ('\') и знаки доллара ('$') не будут иметь особого значения"

0 голосов
/ 15 марта 2018

В Groovy вы также можете использовать регулярные выражения следующим образом:

afile = afile.replaceAll(/(\\)/, "/")
println("replaced string: "+ afile)

Обратите внимание, что (как сказал Sorrow) replaceAll возвращает результат, но не изменяет строку.Поэтому перед печатью необходимо назначить переменную.

0 голосов
/ 16 июня 2011

String Object является неизменным, поэтому если вы вызываете метод для строкового объекта, который изменяет его.Он всегда будет возвращать новый строковый объект (модифицированный).Поэтому вам нужно сохранить возвращаемый результат методом replaceAll () в объект String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...