Как получить (разделить) имена файлов из строки в Java?

1

У меня есть строка, которая содержит имена файлов, такие как:

"file1.txt file2.jpg tricky file name.txt other tricky filenames containing áéíőéáóó.gif"

Как я могу получить имена файлов один за другим? Я ищу наиболее безопасный метод, который лучше всего подходит, желательно что-то стандартное Java. Там уже должно быть какое-то регулярное выражение, я рассчитываю на ваш опыт.

Изменение: ожидаемые результаты: "file1.txt", "file2.jpg", "сложный файл name.txt", "другие хитроумные имена файлов, содержащие áéíőéáóó.gif"

Спасибо за помощь, Sziro

  • 3
    Можете ли вы показать, как вы ожидаете, что имена файлов будут разделены? Может ли пробел быть частью имени файла? Всегда ли файлы заканчиваются известными расширениями?
  • 0
    как вы можете видеть, пробел может быть частью имени "хитрое имя файла.txt" и "другие хитрые имена файлов, содержащие файл gif"
Показать ещё 5 комментариев
Теги:
string
file

4 ответа

1
Лучший ответ

Регулярное выражение, предложенное 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());
}
  • 0
    Да, лучше, это охватывает больше случаев. Спасибо!
1

Если вы хотите использовать регулярные выражения, вы можете найти все вхождения:

(\S.*?\.\S+)

(вы можете проверить его здесь)

  • 0
    Как я могу использовать его в Java? String [] attachmentFiles = attachmentDisplay.split ("(\\ S. *? \\. \\ S +)"); не возвращает правильный ответ.
  • 1
    split не использует регулярные выражения, вы можете проверить, как использовать регулярные выражения в Java здесь: vogella.com/tutorials/JavaRegularExpressions/article.html
Показать ещё 2 комментария
0

Если в именах файлов есть пробелы, это делает его более сложным.

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

Если вы не можете предположить, что в именах файлов нет точек, например my file.new something.txt

В этой ситуации я предлагаю вам создать список допустимых расширений, например.doc,.jpg,.pdf и т.д.

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

0
    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());
    }
  • 0
    Это не вернет "хитрый файл name.txt", только "name.txt".
  • 0
    @Sziro теперь я использовал регулярные выражения и исправил это :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню