Примечание
import java.io.File;
def fileNames = [ "/a/b.c/first.txt",
"/b/c/second",
"c:\\a\\b.c\\third...",
"c:\\a\b\\c\\.text"
]
def fileSeparator = "";
fileNames.each {
// You can keep the below code outside of this loop. Since my example
// contains both windows and unix file structure, I am doing this inside the loop.
fileSeparator= "\\" + File.separator;
if (!it.contains(File.separator)) {
fileSeparator = "\\/"
}
println "File extension is : ${it.find(/((?<=\.)[^\.${fileSeparator}]+)$/)}"
it = it.replaceAll(/(\.([^\.${fileSeparator}]+)?)$/,"")
println "Filename is ${it}"
}
Некоторые из приведенных ниже решений (кроме того, что использует библиотеку apache) не работают для этого примера — c:/test.me/firstfile
Если я попытаюсь найти расширение для вышеуказанной записи, я получу ".me/firstfile" - :(
Лучшим подходом будет найти последнее вхождение File.separator, если оно присутствует, а затем найти имя файла или расширение.
Примечание: (Ниже показан небольшой трюк. В Windows разделителем файлов является \. Но это специальный символ в регулярном выражении, поэтому, когда мы используем переменную, содержащую File.separator в регулярное выражение, я должен избежать его, поэтому я делаю это:
def fileSeparator= "\\" + File.separator;
Надеюсь, это имеет смысл :)
Попробуйте это:
import java.io.File;
String strFilename = "C:\\first.1\\second.txt";
// Few other flavors
// strFilename = "/dd/dddd/2.dd/dio/dkljlds.dd"
def fileSeparator= "\\" + File.separator;
if (!strFilename.contains(File.separator)) {
fileSeparator = "\\/"
}
def fileExtension = "";
(strFilename =~ /((?<=\.)[^\.${fileSeparator}]+)$/).each { match, extension -> fileExtension = extension }
println "Extension is:$fileExtension"
person
Sajumon Joseph
schedule
19.02.2016
.
. - person Bart Kiers   schedule 15.10.2009