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

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

26.07.2025, 22:20. Показов 3665. Ответов 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
Сообщений: 694
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
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 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
Сообщений: 694
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
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 5
27.07.2025, 00:28  [ТС]
Цитата Сообщение от lesser Посмотреть сообщение
Я не знаю правила формата версий, но подозреваю, что лидирующие нули выходят за рамки правил. Т.е. 1.09 должно быть 1.0.9
вот и я не знаю
$tests2 выходит
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
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
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 5
27.07.2025, 09:36  [ТС]
YuS_2, это не упростит, а перенесёт в другой блок.
[ValidateNotNullOrWhiteSpace] — нету в 5.1 и свои сообщения об ошибке в 5,1 тоже не подвезли. в 7+ можно error message задать и то не везде, вроде.
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
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
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 5
27.07.2025, 09:48  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
1.09 - должно быть эквивалентно 1.9.0, а не 1.0.9
$tests1 значит
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
27.07.2025, 09:53
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
[ValidateNotNullOrWhiteSpace] — нету в 5.1 и свои сообщения об ошибке в 5,1 тоже не подвезли.
Да, точно... ещё не было... но [ValidatePattern("\d")] его вполне заменяет, т.е. если цифра отсутствует, то будет исключение, в том числе и на пустую строку и с пробелами без цифр...
С сообщениями - ну, не знаю... а надо ли их генерировать? Нет, я не навязываю ничего, но есть ли в них особый смысл?
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 694
27.07.2025, 09:56
Ну или после 1.09 должна быть 1.10, ведь так?

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

Цитата Сообщение от YuS_2 Посмотреть сообщение
но если очень надо, то try-catch вполне может справиться с переопределением сообщения об ошибке, в 5.1 он присутствует
Это к чему? В функции всё норм и так выводится. Не понял предложения.
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
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
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 5
27.07.2025, 10:26  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
В смысле, надо ли обработку исключений определять в функции? Можно ведь вызов обрамить try-catch и переопределять вывод ошибки...
Это я вообще не понял. Зачем меня спрашивать, ты же чего то предлагаешь, я не понимаю чего.
Лучше кодом
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
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
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 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
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
27.07.2025, 11:31
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
пару мс для меня очень важны
ну, если только...

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

Добавлено через 7 минут
В том смысле, что встроенная валидация параметра заменяет два условных блока из твоей функции... ну, а при необходимости, можно исключение перехватить и вывести понятное сообщение, причем один раз проверяется, вместо двух... пару мс выиграть таки можно. При этом, сама функция будет работать быстрее...
0
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 5
27.07.2025, 11:48  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
А вот, встраивать перехват ошибок в саму функцию - имхо, лишнее действие, неизбежно замедляющее общее выполнение (пару мс, всё ещё важны? ), причем перманентно. Как-то так.
Оно ничем не отличается от ValidatePattern. Та же регулярка, таже генерация исключения + хз чего ещё. Только в блоке параметров. И без кастомного сообщения.
Цитата Сообщение от YuS_2 Посмотреть сообщение
В том смысле, что встроенная валидация параметра заменяет два условных блока из твоей функции...
За уши притянуто. Регулярка то таже. А значит throw "Параметр «Version» не может быть пустым." можно и убрать, но не буду, разделено специально, ради сообщения. И снаружи не обязательно ничего перехватывать. Сразу с нужным сообщением будет ошибка.
А тебе ещё надо отличать ошибки, там у меня 3 throw, причём последний перехватывает чужое исключение и генерирует своё, вот ужас-ужас-то
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru