С Новым годом! Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5

Парсинг версий, ожидаемый результат

26.07.2025, 22:20. Показов 3537. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какие бы вы ожидали результаты от парсинга версий?

PowerShell
1
2
3
4
5
6
7
8
 $tests1 = @(
    @{ Input = "1"; Expected = "1.0" }
    @{ Input = "1.05"; Expected = "1.5" }
    @{ Input = "v2.0.1"; Expected = "2.0.1" }
    @{ Input = "3.0.0.5"; Expected = "3.0.0.5" }
    @{ Input = "01.02.003"; Expected = "1.2.3" }
    @{ Input = "22.10.01.105"; Expected = "22.10.1.105" }
)
PowerShell
1
2
3
4
5
6
7
8
$tests2 = @(
    @{ Input = "1"; Expected = "1.0" }
    @{ Input = "1.05"; Expected = "1.0.5" }
    @{ Input = "v2.0.1"; Expected = "2.0.1" }
    @{ Input = "3.0.0.5"; Expected = "3.0.0.5" }
    @{ Input = "01.02.003"; Expected = "1.0.2.0" }
    @{ Input = "22.10.01.105"; Expected = "22.10.0.1" }
)
Какие ещё варианты написания версий вы знаете?

Имеющиеся функция:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function ParseVersion {
<#
.SYNOPSIS
    Парсит строку версии в объект [version].
 
.DESCRIPTION
    Преобразует строку версии в объект [version],
    удаляя все нечисловые символы, кроме точек.
    Автоматически добавляет «.0» если в версии указан только MAJOR компонент.
    Для чего — Объекты [version] можно сравнивать между собой.
 
.PARAMETER version
    Строка версии для парсинга (например, "v1.2.3" или "1.0.0-beta").
 
.EXAMPLE
    ParseVersion.ps1 "..1.."      # → 1.0
    ParseVersion.ps1 "1"          # → 1.0
    ParseVersion.ps1 "v2.5.1"     # → 2.5.1
    ParseVersion.ps1 "3.0.0-beta" # → 3.0.0
 
.NOTES
    Автор: iNNOKENTIY21
    Дата: 17.07.2025
#>
 
    param (
        [string] $Version
    )
 
    # Проверка на пустую строку или пробелы
    if ([string]::IsNullOrWhiteSpace($Version)) {
        throw "Параметр «Version» не может быть пустым."
    }
 
    # Очистка от всех знаков, кроме цифр и точек
    $cleaned = ($Version -replace '[^0-9.]', '').Trim('.')
 
    # Проверка наличия хотя бы одной цифры
    if (-not [regex]::IsMatch($cleaned, '\d')) {
        throw "Строка версии «$Version» не содержит цифр."
    }
 
    # Автоматическое добавление .0 если нужно, типа "1" → "1.0"
    if ($cleaned -notmatch '^\d+\.') {
        $cleaned += '.0'
    }
 
    try {
        return [version]::Parse($cleaned)
    }
    catch {
        $errMsg = $_.Exception.Message
        throw "Невозможно распознать версию из «$Version» ($cleaned): $errMsg"
    }
}
её тест:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
foreach ($test in $tests1) {
    $result = ParseVersion $test.Input
    $expected = [version]$test.Expected
 
    if ($result -eq $expected) {
        Write-Host "✅ '$($test.Input)' → $result" -ForegroundColor Green
    }
    else {
        Write-Host "❌ '$($test.Input)' → $result (ожидалось: $expected)" -ForegroundColor Red
    }
}
и вывод теста:
PowerShell
1
2
3
4
5
6
'1'1.0'1.05'1.5'v2.0.1' → 2.0.1
✅ '3.0.0.5' → 3.0.0.5
✅ '01.02.003' → 1.2.3
✅ '22.10.01.105' → 22.10.1.105
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.07.2025, 22:20
Ответы с готовыми решениями:

Синхронизация расшареных ресурсов с контролем версий
Здравствуйте. Подскажите, существует ли возможность синхронизации расшареных ресурсов с контролем...

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

Загрузка разных версий Windows
Помогите пожалуйста:) На ПК две системы: Вин 7 и Вин ХР. Выбираю в загрузчике семёрку - всё...

40
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
26.07.2025, 23:18
Добавьте еще [semver]


PowerShell
1
2
3
4
5
 $ [semver] '7.6.0-preview.4'
 
Major  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
7      6      0      preview.4
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
26.07.2025, 23:54  [ТС]
Цитата Сообщение от lesser Посмотреть сообщение
Добавьте еще [semver]
Он только pwsh и так же убирает ведущие нули: 1.09 становится 1.9, а если следом за 1.09 выпустят версию 1.1 и будет сравнение с 1.9.
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
27.07.2025, 00:17
Я не знаю правила формата версий, но подозреваю, что лидирующие нули выходят за рамки правил. Т.е. 1.09 должно быть 1.0.9

PS. Прверил лог обновлений пакетов `/var/log/pacman.log`, есть исключения
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$  (sls '\(\d+\.0\d+\..*\)$' /var/log/pacman.log).Matches.Value
25.04.0-1)
25.04.0-1)
16.04.0.r498-2)
16.04.0.r498-2)
1.08.1-1)
2024.08.19.r24.gf6ab243-1)
2.03.31-1 -> 2.03.32-1)
2.03.31-1 -> 2.03.32-1)
25.04.0-1 -> 25.05.0-1)
25.04.0-1 -> 25.05.0-1)
2024.08.19.r24.gf6ab243-1 -> 2025.03.03.r0.gf6ab243-1)
25.05.0-1 -> 25.05.0-2)
25.05.0-1 -> 25.05.0-2)
25.05.0-2 -> 25.06.0-1)
25.05.0-2 -> 25.06.0-1)
2025.01.1-1 -> 2025.05-1)
2.03.32-1 -> 2.03.33-1)
2.03.32-1 -> 2.03.33-1)
25.06.0-1 -> 25.07.0-1)
25.06.0-1 -> 25.07.0-1)
2025.02.20-1 -> 2025.07.10-1)
2025.03.03.r0.gf6ab243-1 -> 2025.03.03.r1.g739cddf-1)
2025.03.03.r1.g739cddf-1 -> 2025.07.23.r0.g6c26f99-1)
1
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
27.07.2025, 00:28  [ТС]
Цитата Сообщение от lesser Посмотреть сообщение
Я не знаю правила формата версий, но подозреваю, что лидирующие нули выходят за рамки правил. Т.е. 1.09 должно быть 1.0.9
вот и я не знаю
$tests2 выходит
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 09:18
Пара замечаний:
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
# Проверка на пустую строку или пробелы
    if ([string]::IsNullOrWhiteSpace($Version)) {
        throw "Параметр «Version» не может быть пустым."
    }
А зачем?
есть же:
PowerShell
1
[ValidateNotNullOrWhiteSpace]
- для параметров вполне себе достаточно...

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
# Проверка наличия хотя бы одной цифры
    if (-not [regex]::IsMatch($cleaned, '\d')) {
        throw "Строка версии «$Version» не содержит цифр."
    }
и здесь, тоже есть:
PowerShell
1
[ValidatePattern("\d")]
- В том смысле, что можно упростить функцию...
1
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
27.07.2025, 09:36  [ТС]
YuS_2, это не упростит, а перенесёт в другой блок.
[ValidateNotNullOrWhiteSpace] — нету в 5.1 и свои сообщения об ошибке в 5,1 тоже не подвезли. в 7+ можно error message задать и то не везде, вроде.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 09:40
Цитата Сообщение от lesser Посмотреть сообщение
Я не знаю правила формата версий, но подозреваю, что лидирующие нули выходят за рамки правил. Т.е. 1.09 должно быть 1.0.9
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
вот и я не знаю
Существует необязательный стандарт (тот самый SemVer)... по сути, можно опираться на него.
Обычный номер версии ДОЛЖЕН иметь формат X.Y.Z, где X, Y и Z — неотрицательные целые числа и НЕ ДОЛЖНЫ начинаться с нулей. X — мажорная версия, Y — минорная версия и Z — патч-версия. Каждый элемент ДОЛЖЕН увеличиваться численно. Например: 1.9.0 ->1.10.0 -> 1.11.0.
То бишь, ведущие нули не должны присутствовать. Это ведь небольшая проблема... ведущие нули просто надо не учитывать или удалять.
1.09 - должно быть эквивалентно 1.9.0, а не 1.0.9
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
27.07.2025, 09:48  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
1.09 - должно быть эквивалентно 1.9.0, а не 1.0.9
$tests1 значит
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 09:53
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
[ValidateNotNullOrWhiteSpace] — нету в 5.1 и свои сообщения об ошибке в 5,1 тоже не подвезли.
Да, точно... ещё не было... но [ValidatePattern("\d")] его вполне заменяет, т.е. если цифра отсутствует, то будет исключение, в том числе и на пустую строку и с пробелами без цифр...
С сообщениями - ну, не знаю... а надо ли их генерировать? Нет, я не навязываю ничего, но есть ли в них особый смысл?
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
27.07.2025, 09:56
Ну или после 1.09 должна быть 1.10, ведь так?

PowerShell
1
([version] '1.09') -gt ([version] '1.10')    # False
1
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 09:59
Цитата Сообщение от YuS_2 Посмотреть сообщение
С сообщениями - ну, не знаю... а надо ли их генерировать? Нет, я не навязываю ничего, но есть ли в них особый смысл?
но если очень надо, то try-catch вполне может справиться с переопределением сообщения об ошибке, в 5.1 он присутствует
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
27.07.2025, 10:06  [ТС]
lesser,
Цитата Сообщение от lesser Посмотреть сообщение
у или после 1.09 должна быть 1.10, ведь так?
ключевое тут, должно в какой то вселенной, но не в этой. тут как только не пишут

Цитата Сообщение от YuS_2 Посмотреть сообщение
но если очень надо, то try-catch вполне может справиться с переопределением сообщения об ошибке, в 5.1 он присутствует
Это к чему? В функции всё норм и так выводится. Не понял предложения.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 10:25
Цитата Сообщение от lesser Посмотреть сообщение
([version] '1.09') -gt ([version] '1.10')    # False
это лексикографическое сравнение, потому и...
А сравнивать необходимо цифры, тогда будет как должно быть


Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Это к чему? В функции всё норм и так выводится. Не понял предложения.
В смысле, надо ли обработку исключений определять в функции? Можно ведь вызов обрамить try-catch и переопределять вывод ошибки...

Добавлено через 5 минут
Цитата Сообщение от lesser Посмотреть сообщение
Ну или после 1.09 должна быть 1.10, ведь так?
PowerShell
1
([version] '1.09') -gt ([version] '1.10')    # False
А, стоп... а что тут не так?
1.09 более старшая версия, чем 1.10, то бишь 1.10 больше чем 1.09, так что всё верно
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
27.07.2025, 10:26  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
В смысле, надо ли обработку исключений определять в функции? Можно ведь вызов обрамить try-catch и переопределять вывод ошибки...
Это я вообще не понял. Зачем меня спрашивать, ты же чего то предлагаешь, я не понимаю чего.
Лучше кодом
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 10:39
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Лучше кодом
можно и кодом...
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
function test{
param(
    [ValidatePattern('\d')]
    $num
)
    write-host $num
}
 
try{
    test -num ' '
} catch{
    "Сеня, быстро объясни товарищу, зачем Володька сбрил усы. У нас очень мало времени!"
}
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
27.07.2025, 11:07  [ТС]
YuS_2, так низя, надо же истинную ошибку вывести.
PowerShell
1
2
3
4
5
6
try{
    test -num ' '
} catch{
    "Сеня, быстро объясни товарищу, зачем Володька сбрил усы. У нас очень мало времени!"
    $_.Exception.Message
}
Да и
PowerShell
1
2
3
    if (-not [regex]::IsMatch($cleaned, '\d')) {
        throw "Строка версии «$Version» не содержит цифр."
    }
побыстрее будет, пару мс для меня очень важны
И я не понял, зачем мне снаружи функции делать перехват, ради вывода кастомного сообщения об ошибке, произошедшей внутри функции.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 11:31
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
пару мс для меня очень важны
ну, если только...

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
зачем мне снаружи функции делать перехват, ради вывода кастомного сообщения об ошибке, произошедшей внутри функции.
Ну, опять же, ничего не навязываю... но как вижу я:
зачем вообще исключения перехватывать? Для информативности сообщения человеку, предполагаю... то бишь, чтобы пользователь понял, что пошло не так. А т.к. встроенные сообщения, предназначены больше для специалистов (разработчиков, скорее), то достаточно текстом описать, возможные ошибки, если потребуется.
А вот, встраивать перехват ошибок в саму функцию - имхо, лишнее действие, неизбежно замедляющее общее выполнение (пару мс, всё ещё важны? ), причем перманентно. Как-то так.

Добавлено через 7 минут
В том смысле, что встроенная валидация параметра заменяет два условных блока из твоей функции... ну, а при необходимости, можно исключение перехватить и вывести понятное сообщение, причем один раз проверяется, вместо двух... пару мс выиграть таки можно. При этом, сама функция будет работать быстрее...
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 944
Записей в блоге: 5
27.07.2025, 11:48  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
А вот, встраивать перехват ошибок в саму функцию - имхо, лишнее действие, неизбежно замедляющее общее выполнение (пару мс, всё ещё важны? ), причем перманентно. Как-то так.
Оно ничем не отличается от ValidatePattern. Та же регулярка, таже генерация исключения + хз чего ещё. Только в блоке параметров. И без кастомного сообщения.
Цитата Сообщение от YuS_2 Посмотреть сообщение
В том смысле, что встроенная валидация параметра заменяет два условных блока из твоей функции...
За уши притянуто. Регулярка то таже. А значит throw "Параметр «Version» не может быть пустым." можно и убрать, но не буду, разделено специально, ради сообщения. И снаружи не обязательно ничего перехватывать. Сразу с нужным сообщением будет ошибка.
А тебе ещё надо отличать ошибки, там у меня 3 throw, причём последний перехватывает чужое исключение и генерирует своё, вот ужас-ужас-то
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
27.07.2025, 12:03
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
За уши притянуто. Регулярка то таже.
Не притянуто.
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
PowerShell
1
2
3
4
5
6
7
8
9
10
11
...
# Проверка на пустую строку или пробелы
    if ([string]::IsNullOrWhiteSpace($Version)) {
        throw "Параметр «Version» не может быть пустым."
    }
...
# Проверка наличия хотя бы одной цифры
    if (-not [regex]::IsMatch($cleaned, '\d')) {
        throw "Строка версии «$Version» не содержит цифр."
    }
...
- эти два блока, работающих всегда, заменяются одним этим:
PowerShell
1
[ValidatePattern('\d')]
- да, тоже работающим всегда...
- но ты можешь проверить ведь, что будет быстрее, инструменты для этого есть

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
И снаружи не обязательно ничего перехватывать.
конечно, необязательно... если правильные параметры подавать
А вот если, что попало под руку - при возникновении исключения, можно и перехватить...

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
А тебе ещё надо отличать ошибки, там у меня 3 throw, причём последний перехватывает чужое исключение и генерирует своё, вот ужас-ужас-то
Зачем их отличать, если их нет? А если есть - задача нетрудная, описать возможные ошибки и сравнить, чего там такого подали на вход...

Ты главное не понял:
Твои два условных блока, заменяются одной проверкой
А кто там говорил:
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
пару мс для меня очень важны
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2025, 12:03
Помогаю со студенческими работами здесь

Определение номеров версий файлов и занесение результатов в массив
всем доброго времени суток)) прошу прощения за свою неосведомлённость в плане принципов общения на...

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

Создать список имён компьютеров и версий используемого на них почтового клиента
Добрый день! Ситуация такая... В сети есть порядка 800 компьютеров, на которых в одном и том же...

Поиск новейших версий файлов из одноимённых файлов, находящихся в двух каталогах, и перенос найденных в третий
Здравствуйте. Возникла необходимость в создании кода на batch, который делает следующее. Сначала...

Необходимо ли иметь на Live-реаниматоре несколько версий MSDaRT?
Необходимо ли что на Live-реаниматоре нужно иметь несколько версий MSDaRT-а, чтоб мочь применять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru