Java также использует экранирование обратной косой черты, поэтому вам нужно дважды экранировать обратную косую черту, один раз для строки Java и один раз для регулярного выражения.
"([a-zA-Z]:)?(\\\\[a-zA-Z0-9_.-]+)+\\\\?"
Ваше регулярное выражение соответствует литеральной строке '[-zA-Z0-9_-' и литералу '?' в конце. Я также добавил туда точку, чтобы разрешить 'abc.txt' ..
Тем не менее, рассмотрите возможность использования другого механизма для определения допустимых имен файлов, поскольку существуют разные схемы (например, Unix). java.util.File, вероятно, выдаст исключение, если путь неверен, что может быть хорошей альтернативой, хотя я не люблю использовать исключения для потока управления ...