У меня есть строка, которая содержит имена файлов, такие как:
"file1.txt file2.jpg tricky file name.txt other tricky filenames containing áéíőéáóó.gif"
Как я могу получить имена файлов один за другим? Я ищу наиболее безопасный метод, который лучше всего подходит, желательно что-то стандартное Java. Там уже должно быть какое-то регулярное выражение, я рассчитываю на ваш опыт.
Изменение: ожидаемые результаты: "file1.txt", "file2.jpg", "сложный файл name.txt", "другие хитроумные имена файлов, содержащие áéíőéáóó.gif"
Спасибо за помощь, Sziro
Регулярное выражение, предложенное enrico.bacis(\ S.?.\S+) *, не будет работать, если перед символами есть символы без символов. " как.project.
Правильный шаблон:
(([^ .]+ +)*\S*\.\S+)
Вы можете попробовать его здесь.
Программа Java, которая может извлекать имена файлов, будет выглядеть так:
String patternStr = "([^ .]+ +)*\\S*\\.\\S+";
String input = "file1.txt .project file2.jpg tricky file name.txt other tricky filenames containing áéíoéáóó.gif";
Pattern pattern = Pattern.compile(patternStr, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group());
}
Если вы хотите использовать регулярные выражения, вы можете найти все вхождения:
(\S.*?\.\S+)
(вы можете проверить его здесь)
Если в именах файлов есть пробелы, это делает его более сложным.
Если вы можете предположить, что в именах файлов нет точек (.), Вы можете использовать точку для поиска каждой отдельной записи, как было предложено.
Если вы не можете предположить, что в именах файлов нет точек, например my file.new something.txt
В этой ситуации я предлагаю вам создать список допустимых расширений, например.doc,.jpg,.pdf и т.д.
Я знаю, что список может быть длинным, поэтому он не идеален. Как только вы это сделаете, вы можете искать эти расширения и предполагать, что перед тем, как это действительное имя файла.
String txt = "file1.txt file2.jpg tricky file name.txt other tricky filenames containing áéíőéáóó.gif";
Pattern pattern = Pattern.compile("\\S.*?\\.\\S+"); // Get regex from enrico.bacis
Matcher matcher = pattern.matcher(txt);
while (matcher.find()) {
System.out.println(matcher.group().trim());
}