Регулярное выражение Java, как получить версию из строки?

Регулярное выражение необходимо для поиска версии в строке вида:

0.6.9b-version   -    0.6.9b
v0.6.99 - 0.6.99
v01.23.97 - 01.23.97
v01.23.97a-release - 01.23.97a
v1.23.97a-release - 1.23.97a

Слева какая-то начальная строка, справа то, что нужно получить.

Я растерялся закинуть это в конфигуратор, но моих знаний регулярных выражений оказалось недостаточно

Я заканчиваю это на

(\d[\w.()]+?[a-z])

но делает зеркальную операцию, удаляет наоборот то, что мне нужно оставить

Сопоставьте ^v?(\d+(?:\.\d+)*\p{L}?).* и замените на $1.

anubhava 08.04.2024 15:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

узор: (v)?([0-9]+(\\.[0-9]+)*[a-z]?)(-\\w+)?

import java.util.regex.*;

public class Main {
    public static void main(String[] args) {
        String[] lines = { "0.6.9b-version", "v0.6.99", "v01.23.97", "v01.23.97a-release", "v1.23.97a-release" };
        Pattern pattern = Pattern.compile("(v)?([0-9]+(\\.[0-9]+)*[a-z]?)(-\\w+)?");

        for (String line : lines) {
            Matcher matcher = pattern.matcher(line);
            if (matcher.matches()) {
                System.out.println(matcher.group(2));  // Group 2 contains the version number
            }
        }
    }
}
Ответ принят как подходящий

Чтобы преобразовать строку версии в строку стандартизированной версии:

version = version.replaceFirst("v?([^-]+).*", "$1")

Это удалит первый необязательный v, сохранит все до необязательного - и удалит все, что будет после него.

Используйте средство сопоставления, как показывает @Malvin, где [] содержит только допустимые символы версии на случай, если вам нужно сопоставить только строки версии (среди прочего).

Чтобы удалить не только v, но и все нецифры,

version = version.replaceFirst("\\D*([^-]+).*", "$1")

что мне нужно изменить, если я хочу удалить количество букв в начале и оставить только 1 после цифр? vdsd123.123.123.123ahh-sdgs - 123.123.123.123a

rastorguev.i.a 08.04.2024 16:34

Это уже очень полезно, но у меня все еще есть некоторые вопросы. а как насчет «и оставить только 1 букву после цифр»?

rastorguev.i.a 08.04.2024 17:01
"\\D*([.\\d]+\\w?).*"
steffen 08.04.2024 17:04

Вы можете заменить совпадения

^.*- *

с пустой строкой, оставив нужную часть строки.

Демо

Другие вопросы по теме