Что нового

Получение версии файла без завершающих нулей

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Нужно из строки вытащить версию файла, но при этом не зацепить нули в конце версии.
Вот как пытался сделать:

Код:
$vTest = 'some data' & @CRLF & 'version=1.0.8.0' & @CRLF & 'other data'

$sRet = StringRegExpReplace($vTest, '(?si).*?version=([\d\.]+)(\.0)*\r\n.*', '\1')

ConsoleWrite($sRet & @LF)


Замечу, что мне это нужно сделать одним проходом, т.е одним вызовом StringRegExpReplace.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Хотя нужно предусматривать ещё и version=1.10, и чтобы 1.0.0.0 было 1.0...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Вот, вроде идеальный вариант того что я хотел...

Код:
$sVer1 = '1.0.0.0' 		;1.0
$sVer2 = '1.10.0.0' 	;1.10
$sVer3 = '1.0.7.0'		;1.0.7
$sVer4 = '10.12.0.0'	;10.12
$sVer5 = '2.0.05.0'		;2.0.05

$vTest = 'some data' & '\r\n' & 'version=%s' & '\r\n' & 'other data'

For $i = 1 To 5
	$sStr = StringFormat($vTest, Eval('sVer' & $i))
	ConsoleWrite(_StringGetVersion($sStr) & @LF)
Next

Func _StringGetVersion($sStr, $sVar = 'version')
	Return StringRegExpReplace($sStr, '(?si).*?' & $sVar & '=([0-9]+(?:[\d.]+[1-9]+0?|[0-9.]{2})?).*', '\1')
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,901
Репутация
1,200
Принцип вложенности групп. Вроде более понятнее позволяет оперировать.
Код:
Return StringRegExpReplace($sStr, '(?si).*?' & $sVar & '=(\d+(?:.\d+(?:.0?[1-9]+(?:.0?[1-9]+)?)?)?).*', '\1')

Очередная копия группы захватывается если она соответствует критерию
Код:
.0?[1-9]+
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
AZJIO [?]
Очередная копия группы захватывается если она соответствует критерию
Это не работает для трёхзначных цифр, и к тому же не учитывает нули по середине (1.0.0.1).

Код:
$sVer1 = '1.0.020.1' 	;1.0.020.1
$sVer2 = '1.020.0.1'	;1.020.0.1

$vTest = 'some data' & '\r\n' & 'version=%s' & '\r\n' & 'other data'

ConsoleWrite(_StringGetVersion(StringFormat($vTest, $sVer1)) & @LF) ;1.0.02 ???
ConsoleWrite(_StringGetVersion(StringFormat($vTest, $sVer2)) & @LF) ;1.020 ???

Func _StringGetVersion($sStr, $sVar = 'version')
	Return StringRegExpReplace($sStr, '(?si).*?' & $sVar & '=(\d+(?:.\d+(?:.0?[1-9]+(?:.0?[1-9]+)?)?)?).*', '\1')
	;Return StringRegExpReplace($sStr, '(?si).*?' & $sVar & '=([0-9]+(?:[\d.]+[1-9]+0?|[0-9.]{2})?).*', '\1')
EndFunc
 
Верх