Java Regex az, AZ, 0-9 и (.) (_) (-) - PullRequest
       1

Java Regex az, AZ, 0-9 и (.) (_) (-)

7 голосов
/ 22 октября 2011

Написание простого регулярного выражения, но я никогда не был очень хорош в этом.

Я пытаюсь проверить строку (имя файла), чтобы убедиться, что она содержит только az, AZ, 0-9 или специальные символы подчеркивания (_) точка (.) Или тире (-).

Вот что у меня есть

if(filename.length() < 1 || !filename.matches("^[a-zA-Z0-9[.][_][-]]+"))
   return false;
else
   return true;

Это работает, но выглядит не очень элегантномне.Есть ли лучший / более читаемый способ написать это?

Заранее спасибо!Просто пытаюсь научиться лучше писать эти баггеры.

-Will

Ответы [ 3 ]

10 голосов
/ 22 октября 2011

Вам не нужно использовать [] внутри класса символов.

Итак, вы можете написать:

^[-a-zA-Z0-9._]+

Также вы можете использовать \\w вместо a-zA-Z0-9_.

Итак, регулярное выражение будет:

^[-\\w.]+

Кроме того, это регулярное выражение будет соответствовать строке типа StackOverflow 22.10$$2011, потребляя StackOverflow 22.10. Если вам нужно, чтобы ваша строка состояла полностью из этих символов, вам следует завершить шаблон с помощью $ - конец строки:

^[-\\w.]+$
1 голос
/ 22 октября 2011
try {
    boolean foundMatch = subjectString.matches("^[\\w.-]+$");
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

Попробуйте это.

По сути, \ w это сокращение от [a-zA-Z_0-9], и я просто добавляю два других нужных вам символа.

0 голосов
/ 22 октября 2011

Вот метод, который более дорогой (потому что на самом деле касается диска), но будет кроссплатформенным.

По сути, он создает файл с заданным именем и удаляет его, если он ранее не существовал. Если вы попытались создать файл с недопустимым именем, он выдаст ошибку. Поэтому независимо от того, в какой системе вы находитесь, она сообщит вам, правильно ли указано имя файла.

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

public boolean isValidFileName(final String fileName) {
    final File file = new File(fileName);
    final boolean isValid = true;
    try {
        if (file.createNewFile()) {
            file.delete();
        }
    } catch (IOException e) {
        isValid = false;
    }
    return isValid;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...