Что нового

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

CreatoR

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

Код:
$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.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
Может, так?
Код:
For $i = 0 To 3
	$sTest = 'some data' & @CRLF & 'version=1.0.8.' & $i & @CRLF & 'other data'
	ConsoleWrite(StringRegExpReplace($sTest, '(?si).*?version=([1-9].+[1-9])\D.*', '$1') & @LF)
Next
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Да, почти!

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

$sRet = StringRegExpReplace($vTest, '(?si).*?version=([0-9][^\s]+[1-9]).*', '\1')
ConsoleWrite($sRet & @LF)


Вот так будет получше, т.к версия может начинаться и с нуля (0.1.0.0).

Спасибо, тема решена :smile:.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
Ещё усложнил
Код:
$vTest = 'some data' & @CRLF & 'version=1.0.8.0' & @CRLF & 'other data'

$sRet = StringRegExpReplace($vTest, '(?si).*?version=([0-9](?:[.0-9]*[1-9])*).*', '\1')
ConsoleWrite($sRet & @LF)
 
Автор
CreatoR

CreatoR

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

CreatoR

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

Код:
$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,878
Репутация
1,194
Принцип вложенности групп. Вроде более понятнее позволяет оперировать.
Код:
Return StringRegExpReplace($sStr, '(?si).*?' & $sVar & '=(\d+(?:.\d+(?:.0?[1-9]+(?:.0?[1-9]+)?)?)?).*', '\1')

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
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
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
Код:
Return StringRegExpReplace($sStr, '(?si).*?' & $sVar & '=(\d+.\d+(?:.\d+(?:.0?[1-9]+0?)|.0?[1-9]+0?)*).*', '\1')
 
Верх