Вопрос по windows, regex, java, file-io – Разделение имен файлов с помощью символа системного разделителя файлов

16

У меня есть полный путь к файлу, и я хочу получить имя файла.

Я использую следующую инструкцию:

<code>String[] splittedFileName = fileName.split(System.getProperty("file.separator"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
</code>

Но на Windows это дает:

<code>java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^
</code>

Могу ли я избежать этого исключения? Есть лучший способ сделать это?

Ваш Ответ

4   ответа
5

Когда вы пишете имя файла, вы должны использоватьSystem.getProperty("file.separator").

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

Вы можете попробовать следующее:

fileName = fileName.replace("\\", "/");
String[] splittedFileName = fileName.split("/"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
Спасибо @Gilbert Le Blanc, хороший кусок кода! просто и прекрасно работает!
38

Проблема в том, что\ должен быть спасен, чтобы использовать егоas backslash в регулярном выражении. Вы должны либо использоватьAPI расщепления, которыйdoesn't use regular expressionsили используйтеPattern.quote первый:

// Alternative: use Pattern.quote(File.separator)
String pattern = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(pattern);

Или даже лучше, используйтеFile API для этого:

File file = new File(fileName);
String simpleFileName = file.getName();
2

Другим более простым способом может быть сделать

File f = new File(path);
String fileName = f.getName();

Я считаю, что это будет работать при условии, что пути совместимы с платформой, т.е. не уверен, что путь & quot; c: \ file.txt & quot; будет работать на Linux или нет.

0

Прежде всего, для этой конкретной проблемы я бы рекомендовал использовать класс java.util.File вместо регулярных выражений.

При этом корень проблемы, с которой вы сталкиваетесь, заключается в том, что символ обратной косой черты "\" обозначает escape-последовательность в регулярных выражениях Java. Происходит то, что синтаксический анализатор регулярных выражений видит обратную косую черту и ожидает, что после нее будет другой символ, который завершит escape-последовательность. Самый простой способ обойти это - использовать метод java.util.regex.Pattern.quote (), который будет экранировать любые специальные символы в указанной вами строке.

С этим изменением ваш код становится:

String splitRegex = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(splitRegex);
String simpleFileName = splittedFileName[splittedFileName.length-1];

Похожие вопросы