2013-03-24 5 views
3

У меня возникло множество проблем с фильтрацией имен файлов в Java. Я использую тэг PrimeFaces fileUpload, и мне нужно разрешить файлы, которые могут быть загружены, если они содержат только буквенно-цифровые символы, за которыми следует расширение, например «.txt». Чтобы быть конкретным, перед расширением имя должно содержать одно или несколько из AZ, az или 0-9, без пробелов или других символов, за которым следует расширение «.txt», то есть должно быть одно и только одно "" в имени, и это должно быть в начале расширения.Фильтрация имен файлов

До сих пор все попытки фильтрации имен не были разработаны должным образом, если я исключаю ., то он также исключается из расширения. Имя файла должно быть типа: abcXYZ123.txt, aaaccc001.txt и т.д., но не ab.cd.txt и т.д.

Я пробовал различные комбинации /[A-Za-z0-9]+\\.txt$/, /[^\\W_]+\\.txt$/, /[\\p{Alnum}]\\.txt$/ и т.д., но либо они позволяют некоторые недопустимые имена, или исключить somevalid имена.

Некоторая помощь была бы очень признательна.

+0

Судя по примеру в [витрине] (http://www.primefaces.org/showcase/ui/fileUploadAuto.jsf), проблема может быть в ваших двойных обратных косых чертах. Вы пробовали '/^[A-Za-z0-9] + \. Txt $ /'? – Keppil

ответ

1

Я думаю, что вы на правильном пути с $ в конце. Я бы совпадающее с кареткой ^ в начале, чтобы получить

^[A-Za-z0-9]+\\.txt$ 

Подобно тому, как $ означает «конец строки», так ^ означает «начало строки.»

Testing this с регулярными выражениями ^[A-Za-z0-9]+\.txt$, я получаю:

Матчи

  • a.txt
  • abcXYZ123.txt
  • aaccc001.txt

Нет матчи

  • a.b.c.txt
  • ab.cd.txt
  • .txt

В качестве примечания, в зависимости от реализации Regex, цифра, буква может или не может быть равно [A-Za-z0-9] – он может содержать цифры из других систем нумерации (например,六, что составляет шесть на китайском языке).

+0

Да, теперь это работает - огромное спасибо. Я забыл, что мне пришлось сопоставить «^» с «$». Я решил не использовать Alnum, поскольку это зависит от набора символов, и мое приложение будет перенесено на компьютер Linux, который может его поддерживать или не поддерживать. Кстати, двойная обратная косая черта необходима, так как одиночная обратная косая черта является escape-символом в Java, поэтому ее нужно экранировать. – csharp

+0

@csharp: Я рад слышать, что это сработало. Если вы нашли этот ответ полезным, рассмотрите его как принятый ответ, нажав галочку в левой части. – wchargin

Смежные вопросы