регулярное выражение Java для соответствия пути к файлу - PullRequest
7 голосов
/ 20 декабря 2010

Я пытался создать регулярное выражение для соответствия пути к файлу в Java, как

C: \ а \ Защита \ ГХИ \ abc.txt

Я попробовал это ([a-zA-Z]:)?(\\[a-zA-Z0-9_-]+)+\\?, как следующий код

import java.util.regex.Pattern;

  public class RETester {

public static void main(String arhs[]){

    String regularExpression = "([a-zA-Z]:)?(\\[a-zA-Z0-9_-]+)+\\?";

    String path = "D:\\directoryname\\testing\\abc.txt";

    Pattern pattern = Pattern.compile(regularExpression);

    boolean isMatched = Pattern.matches(regularExpression,path);
    System.out.println(path);
    System.out.println(pattern.pattern());
    System.out.println(isMatched);

}

}

Однако это всегда дает мне, ложь как результат. Пожалуйста, помогите мне.

Спасибо

Ответы [ 8 ]

17 голосов
/ 20 декабря 2010

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

"([a-zA-Z]:)?(\\\\[a-zA-Z0-9_.-]+)+\\\\?"

Ваше регулярное выражение соответствует литеральной строке '[-zA-Z0-9_-' и литералу '?' в конце. Я также добавил туда точку, чтобы разрешить 'abc.txt' ..

Тем не менее, рассмотрите возможность использования другого механизма для определения допустимых имен файлов, поскольку существуют разные схемы (например, Unix). java.util.File, вероятно, выдаст исключение, если путь неверен, что может быть хорошей альтернативой, хотя я не люблю использовать исключения для потока управления ...

4 голосов
/ 20 декабря 2010

Используйте это регулярное выражение:

"([a-zA-Z]:)?(\\\\[a-zA-Z0-9._-]+)+\\\\?";

Я добавил две модификации: вы забыли добавить . для сопоставления имени файла abc.txt и также требовалось экранирование от обратной косой черты (\\).

1 голос
/ 12 февраля 2016

Поскольку путь содержит папки, а имя папки может содержать любой символ, кроме

?\ /: "* <>

Мы можем использовать приведенное ниже регулярное выражение для сопоставления пути к каталогу [оно использует все символы, которые может предоставить имя папки]

[A-Za-z]:[A-Za-z0-9\!\@\#\$\%\^\&\(\)\'\;\{\}\[\]\=\+\-\_\~\`\.\\]+
1 голос
/ 19 сентября 2011

Просто говоря, нужно заменить . в

([a-zA-Z]:)?(\\\\[a-zA-Z0-9_.-]+)+\\\\?

с \\.

. предназначен для любого символа в регулярном выражении (стиль Java), тогда как
\. специально предназначен для. персонаж, и нам нужно избежать обратной косой черты

1 голос
/ 20 декабря 2010

Это не соответствует, потому что ваше регулярное выражение соответствует только путям, а не файлам. - Более правильно: он не принимает точку в вашем имени файла.

И, кроме того, есть проблема с побегом, упомянутая икрой.

0 голосов
/ 17 сентября 2015

Если он должен совпадать только с путем к файлам, лежащим на той же машине, где запущено ваше приложение, тогда вы можете использовать:

try{
    java.nio.file.Paths.get(yourPath);
}(catch InvalidPathException err){
}

Так что, если вы запускаете свое приложение в Windows, кодвыше будет ловить недопустимые пути Windows, и если вы работаете в Unix, он будет ловить недопустимые пути Unix и т. д.

0 голосов
/ 24 октября 2014

Вот правильное регулярное выражение для файловой системы Windows:

Регулярное выражение:

(?:[a-zA-Z]\:)\\([\w-]+\\)*\w([\w-.])+  

как строка Java

"(?:[a-zA-Z]\\:)\\\\([\\w-]+\\\\)*\\w([\\w-.])+"
0 голосов
/ 20 декабря 2010

Есть две причины, почему это дает вам ложь.Во-первых, вам нужно \\\\ вместо \\, потому что вам нужно экранировать этих персонажей.И второе: вам не хватает точечного символа, вы можете вставить его до a-z как ([a-zA-Z]:)?(\\\\[.a-zA-Z0-9_-]+)+\\\\?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...