Это относится ко всем каталогам спектров, конечным или начальным слешам.
Все остальные здесь пока нет ...
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: скобки - это группа захвата, которую мы возвращаем в конце.
Надеюсь, это немного прояснится.