Regex для удаления всех имен каталогов из пути (оставьте имя файла) - PullRequest
9 голосов
/ 29 января 2011

Я хочу удалить все имена каталогов из пути:

Payload/brownie.app/Info.plist

должно стать

Info.plist

Какое регулярное выражение я должен использовать или я могу использовать replace () из String в Java?спасибо!

Ответы [ 6 ]

20 голосов
/ 29 января 2011

Попробуйте это:

new File("Payload/brownie.app/Info.plist").getName()

Возвращает имя файла без каталогов.

Пример:

String filename = new File("Payload/brownie.app/Info.plist").getName();
System.out.println(filename);

Выход:

Info.plist
11 голосов
/ 29 января 2011

Вам не нужно регулярное выражение. Просто найдите последнюю косую черту и используйте подстроку:

int index = path.lastIndexOf(File.separatorChar);
String name = path.substring(index+1);

или используйте:

new File(path).getName();
8 голосов
/ 11 декабря 2012

Это относится ко всем каталогам спектров, конечным или начальным слешам.

Все остальные здесь пока нет ...

public static String extractFilename(String path)  {  
    java.util.regex.Pattern p       = java.util.regex.Pattern.compile('^[/\\\\]?(?:.+[/\\\\]+?)?(.+?)[/\\\\]?$');
    java.util.regex.Matcher matcher = p.matcher(path);

    if ( matcher.find() ) {
        return matcher.group(1);
    }
    return null;
}

println extractFilename("data\\\\path/to/file/RandomFile.pdf")
println extractFilename("RandomFile.pdf")
println extractFilename("RandomFile.pdf/")
println extractFilename("data\\\\path/to/file/RandomFile.pdf/")
println extractFilename("/data\\\\path/to/file/RandomFile.pdf/")
println extractFilename("/data\\\\path/to/file/RandomFile.pdf")
println extractFilename("/RandomFile.pdf")
println extractFilename("/RandomFile.pdf/")
println extractFilename("/")

Печать

RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
/

............................................... ........................РЕДАКТИРОВАТЬ......................... .................................................. .

Объяснение для Uday. На самом деле это было довольно сложно, и я не уверен, что могу сегодня отстаивать все это, но я попробую:)

^[/\\\\]?(?:.+[/\\\\]+?)?(.+?)[/\\\\]?$

0: полное регулярное выражение

^

1: начинается с

[/\\\\]?

2: прямая или обратная косая черта (да, четыре косых черты за одну, безумие!). Один раз или нет, поэтому не требуется.

(?:.+[/\\\\]+?)? 

3: Этот шаг сложный. Он предназначен для пропуска всего, кроме последнего, соответствующего этому шаблону, группы без захвата (?: ... если мы ищем какой-либо символ несколько раз, за ​​которым следует один слеш.

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

Хотя весь этот кусок не обязателен из-за? вне скобок. Например, «/RandomFile.pdf/» не будет генерировать совпадение здесь и будет продолжать с 4.

Тем не менее, теперь я нахожу это немного странным, так как. + Жадный, но все же с нетерпением ждет слеша для матча. Это может быть природа групп, что они не жадные или ошибка в синтаксисе шаблонов Java.

(.+?)[/\\\\]?$

4: поскольку регулярное выражение применяется ко всей строке, оно также должно соответствовать до конца. Предыдущее совпадение на 3 было не жадным, неохотно используя +?, Означая, что оно будет совпадать только до тех пор, пока регулярное выражение не совпадет. Наше слово в конце $ находится в скобках, которые могут заканчиваться или не заканчиваться косой чертой. Я решил вернуть корневой путь в качестве имени файла, если имя файла отсутствует, а есть только косая черта, поскольку это также имя файла (имя каталога)

5: скобки - это группа захвата, которую мы возвращаем в конце.

Надеюсь, это немного прояснится.

3 голосов
/ 29 января 2011

Используйте заменить на регулярное выражение, String name = directory.replaceAll(".*/",""), просто так.

1 голос
/ 21 февраля 2011

Если вы имеете дело с путем к файлу, который был передан браузером на веб-сервер, вы не можете быть уверены, будет ли это путь в стиле DOS, стиль Unix или просто имя файла без пути.Если вы действительно хотите RegEx, это должно сделать это:

String path = "Payload/brownie.app/Info.plist";
String filename = path.replaceFirst("(^.*[/\\\\])?([^/\\\\]*)$","$2");

Это будет работать, независимо от того, есть ли DOS, Unix или отсутствует путь.

Хотя это было бы более разборчиво,использовать подстроки, поскольку dogbane предлагает , но добавляя логику для проверки обоих типов разделителей файлов (опять же, только если вы имеете дело с многоплатформенным вводом).

1 голос
/ 30 января 2011

Все предыдущие ответы проще, чем использование полноразмерного регулярного выражения.Если вы действительно хотите использовать один из них, вот шаблон регулярных выражений, который вы можете использовать: ". * / (. +)"

    Pattern p = Pattern.compile(".*/(.+)");
    Matcher matcher = p.matcher("Payload/brownie.app/Info.plist");

    if ( matcher.find() ) {
        System.out.println("result: "+matcher.group(1));
    }

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

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