Незакрытый символьный класс в Java semver regex - PullRequest
0 голосов
/ 21 февраля 2019

Java 8 здесь.Мне передают String, и я должен сказать, соответствует ли он нашему интервальному представлению семантически версионного файла JAR или нет, который:

  • Начинается с любой буквенно-цифровой строки (дефисы также разрешеныздесь)
  • За ним следует знак (-)
  • , за которым следует обычный semver:
    • Номер основного выпуска;затем
    • Малый номер выпуска;затем
    • Номер исправления
  • Завершается суффиксом .jar

Примеры допустимых имен файлов:

  • some-lib-1.4.17.jar
  • someLib-1.4.17.jar
  • somelib-0.12.0.jar

Моя лучшая попытка на данный момент:

public boolean isValidJarName(String jarName) {
    String fileRegex = "^([a-zA-Z\\-))((\\d+)\\.(\\d+)\\.(\\d+)).jar";
    Pattern filePattern = Pattern.compile(fileRegex);
    Matcher matcher = filePattern.matcher(jarName);

    return matcher.matches();
}

Однако этовыдает ошибку компилятора: Unclosed character class.Так что с моим синтаксисом что-то не так, но я даже не уверен, правильно ли он настроен, чтобы дать мне то, что я ищу.Любые идеи, где я иду не так?

1 Ответ

0 голосов
/ 21 февраля 2019

Помимо этого закрытого класса символов, в вашем текущем регулярном выражении, по-видимому, есть еще несколько проблем:

^([a-zA-Z\\-))((\\d+)\\.(\\d+)\\.(\\d+)).jar

Если ваше намерение состоит в том, чтобы просто совпадать, вам не нужно излишне группировать регулярное выражение и количество группировок.тяжелыйТакже вам не нужно экранировать -, пока он находится внутри класса символов и присутствует либо в начале, либо в конце класса символов.Поскольку ваша строка имеет someLib, что является более чем одним символом, следовательно, вам нужно иметь квантификатор с классом символов и вам нужно экранировать последнюю точку непосредственно перед jar, иначе она может соответствовать любому символу, который может быть нежелателен.Правильное регулярное выражение, которое вы можете использовать, следующее:

^[a-zA-Z-]+\\d+\\.\\d+\\.\\d+\\.jar

Вот код Java,

String jarName = "someLib-1.2.3.jar";
String fileRegex = "^[a-zA-Z-]+\\d+\\.\\d+\\.\\d+\\.jar";
Pattern filePattern = Pattern.compile(fileRegex);
Matcher matcher = filePattern.matcher(jarName);

System.out.println(matcher.matches());

Это теперь печатает,

true

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

^[a-zA-Z]+-(\\d+\\.)+jar

, где [a-zA-Z]+ соответствует одному или нескольким алфавитам, - соответствует дефису, (\\d+\\.)+ соответствует одной или нескольким цифрам, за которыми следует буквальныйточка и все это один или несколько раз, затем, наконец, jar соответствует буквальному jar

...