Как уменьшить двойные точки в выражениях пути, используя Java - PullRequest
1 голос
/ 16 января 2020

Я нахожусь в процессе создания Java приложения, которое, в частности, принимает относительный путь к файлу в форме

String path = "path/to/Plansystem/Xslt/omraade/../../../Kms/Xslt/Rense/Template.xslt"

и сокращает / упрощает выражение пути, так что оно обеспечивает эквивалентный путь , но без двойных точек. То есть, мы должны получить эту строку:

String result = "path/to/Kms/Xslt/Rense/Template.xslt"

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

String parentDirectory = $/\/(?!\.)([\w,_-]*)\.?([\w,_-]*)\/\.\.\//$

Затем я заменяю любое совпадение одним sla * sh. Этот подход, кажется, работает, и я придумал выражение, использующее Regexr.com , но мне кажется, что мой подход немного хакерский, и я был бы удивлен, если бы эта специфическая c функциональность была не доступно в какой-то хорошо проверенной, хорошо развитой библиотеке. Кто-нибудь знаком с такой библиотекой?

Редактировать: Основываясь на ответах rzwitserloot и Энди Тернера, я понял, что следующие методы работают для меня:

public static String slash = "/"
public static final String backslashes = $/\\+/$

static String normalizePath(String first, String... more) {
      String pathToReturn = Paths.get(first, more).normalize().toString().replaceAll(backslashes, slash)
      return pathToReturn
}

Обратите внимание, что замена I make в конце создается только из-за необходимости c, в которой я хочу сохранить нотацию unix (даже при работе на Windows).

Ответы [ 2 ]

4 голосов
/ 16 января 2020

Нет, не беспокойтесь о регулярных выражениях. Для этого есть API!

Basi c 'точка' удаления:

import java.nio.file.Paths;

Paths.get("/Users/Birdie/../../Users/Birdie/workspace/../workspace").normalize()

Получит вам путь, представляющий /Users/Birdie/workspace.

Вы можете go далее и следуйте программным ссылкам, даже:

Paths.get("/Users/Birdie/../../Users/Birdie/workspace/../workspace").toRealPath()
3 голосов
/ 16 января 2020

Использование java.nio.Path:

Path path = Paths.get("path/to/Plansystem/Xslt/omraade/../../../Kms/Xslt/Rense/Template.xslt");
Path normalized = path.normalize();
...