Groovy удалить начало пути - PullRequest
       33

Groovy удалить начало пути

0 голосов
/ 05 сентября 2018

Я пытаюсь удалить начало пути, в котором есть '\' и ''. Я, кажется, получаю некоторые проблемы, говорящие о проблеме с побегом у персонажа 3. Пример: SomePath: C: \ Users \ ADMINISTRATOR \ App Play \ blah \ blah

SomePath.replaceFirst('C:\\Users\\ADMINISTRATOR\\App Play\\', '');

Путь должен быть бла \ бла

Я пробовал:

SomePath.replaceFirst("C:\Users\ADMINISTRATOR\App Play\", "");
SomePath.replaceFirst("C:\\Users\\ADMINISTRATOR\\App Play\\", "");
SomePath.replaceFirst("C:\\\\Users\\\\ADMINISTRATOR\\\\App Play\\\\", "");

SomePath.replaceAll("C:\Users\ADMINISTRATOR\App Play\", "");
SomePath.replaceAll("C:\\Users\\ADMINISTRATOR\\App Play\\", "");
SomePath.replaceAll("C:\\\\Users\\\\ADMINISTRATOR\\\\App Play\\\\", "");

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете решить эту проблему по-другому. Вы можете маркировать ваш входной путь, используя \ в качестве разделителя, а затем вы можете выбрать последние 2 элемента (blah и blah) или пропустить первые 4 элемента (C:, Users, ADMINISTRATOR, App Play). Это зависит от того, какое предположение вам легче вычесть. Рассмотрим следующий пример:

def somePath = 'C:\\Users\\ADMINISTRATOR\\App Play\\blah\\blah'

// Build a new path by accepting the last 2 parts of the initial path
assert 'blah\\blah' == somePath.tokenize('\\')[-2..-1].join('\\')

// Build a new path by skipping the first 4 parts from initial path
assert 'blah\\blah' == somePath.tokenize('\\').drop(4).join('\\')

Первый вариант работает лучше, если вы хотите только две последние части из начального пути. Второй вариант работает лучше, если вы ожидаете окончательный путь, например blah\blah\blahhhh, потому что вы не знаете, сколько вложенных дочерних элементов содержит начальный путь, и хотите начать строить новый путь сразу после \App Play\.

0 голосов
/ 05 сентября 2018

Только что попробовал ... у меня работают примеры с четырьмя обратными слешами:

def somePath = "C:\\Users\\ADMINISTRATOR\\App Play\\blah\\blah"
println somePath
somePath.replaceFirst("C:\\\\Users\\\\ADMINISTRATOR\\\\App Play\\\\", "");

Проблема состоит в том, что для строки требуется один экранирующий \, и поскольку replaceFirst использует регулярное выражение, механизму регулярного выражения требуется еще один \ для выхода из \. Результат - четыре обратных слеша.

Кстати: вы можете использовать строковые операции, чтобы получить ваш путь, но вы также можете попробовать файловые операции, например:

def root= new File("C:\\Users\\ADMINISTRATOR\\App Play\\")
def full= new File("C:\\Users\\ADMINISTRATOR\\App Play\\blah\\blah")
def relPath = root.toPath().relativize( full.toPath() ).toFile()
println relPath

(взято из https://gist.github.com/ysb33r/5804364)

...