Регулярное выражение для извлечения цифр в формате версии

#java #regex

Вопрос:

Я собираюсь извлечь числа из строки. Числа представляют собой версию. Это означает, что я собираюсь сопоставлять числа, которые находятся между:

  • _ и /
  • / и /

Я подготовил следующее регулярное выражение, но оно работает не так, как ожидалось:

 .*[/_](d{1,2}[.]d{1,2}[.]d{1,2})/.*
 

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

Ввод: name_1.1.1/9.10.0/abc . Ожидаемый результат: 1.1.1 и 9.10.0 , но только мое регулярное выражение возвращается 9.10.0 , 1.1.1 опущено. Ты хоть представляешь, в чем дело?

Комментарии:

1. почему бы просто (d .d .d) не найти группы, которые соответствуют

Ответ №1:

Вы можете просто разделить строку на _ или / , а затем сохранить компоненты, которые кажутся версиями:

 List<String> versions = new ArrayList<>();
String input = "name_1.1.1/9.10.0/abc";
String[] parts = input.split("[_/]");
for (String part : parts) {
    if (part.matches("\d (?:\.\d )*")) {
        versions.add(part);
    }
}

System.out.println(versions);  // [1.1.1, 9.10.0]
 

Ответ №2:

Вы можете утверждать / это в конце, а не сопоставлять его, и опустить .*

Обратите внимание, что вам не нужно избегать /

 [/_](d{1,2}[.]d{1,2}[.]d{1,2})(?=/)
 

Демонстрация регулярных выражений | Демонстрация Java

Пример кода

 String regex = "[/_](\d{1,2}[.]\d{1,2}[.]\d{1,2})(?=/)";
String string = "name_1.1.1/9.10.0/abc";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}
 

Выход

 1.1.1
9.10.0
 

Другим вариантом может быть использование положительного взгляда сзади, чтобы указать либо a / , либо _ влево и получить только совпадение.

 (?<=[/_])d{1,2}[.]d{1,2}[.]d{1,2}(?=/)
 

демонстрация регулярных выражений

Ответ №3:

Демонстрация кода

         String regex = "(\d .\d .\d )";
        String string = "name_1.1.1/9.10.0/abc";
        String string2 = "randomversion4.5.6/09.7.8_9.88.9";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(string);
        Matcher matcher2 = pattern.matcher(string2);
        
        while (matcher.find()) {
            System.out.println(matcher.group(1));
        }


        while (matcher2.find()) {
            System.out.println(matcher2.group(1));
        }
 

Из:

 1.1.1
9.10.0
4.5.6
09.7.8
9.88.9
 

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

Регулярное выражение можно использовать для сопоставления целых строк или для определения наличия подстроки в строке.

При использовании регулярного выражения для поиска подстроки вы не всегда можете сопоставить все имена файлов или любую строку. Следовательно, совпадайте только с тем, что вы хотите найти. Таким образом, вы можете найти версии независимо от того, в какой строке они находятся.