2016-01-13 1 views
1

Как часть buildscript в powershell, я пытаюсь извлечь номер версии из строки, используя регулярное выражение. Предполагается, что число в формате xx.yy (например, 10.6) Мне нужна часть Integer (в этом примере это будет 10), а часть дроби (пример: 6)Извлечение значения из регулярных выражений powershell

Я хочу иметь метод, который проверяет, что оба моих шаблона существуют, и после этого извлекает числа. (Я очень новичок в PowerShell, и я пытаюсь избегать использования C# функции, а Powershell себя.)

Я пытался сделать это:

$integralPart="A" 
$fractionPart="B" 

function GetVersion { 
    param([string]$strVersion) 
    $integralPattern="^[0-9]+(?=\.)" 
    $fractionalPattern="(?<=\.)[0-9]+$" 

    #Check if string consists of an integral and fractional part 
    If ($strVersion -match $integralPattern -eq $True -and $strVersion -match $fractionalPattern -eq $True) 
    { 
     $strVersion -match $integralPattern 
     $integralPart = $matches[0] 

     $strVersion -match $fractionalPattern 
     $fractionalPart = $matches[0] 
    } 
    else 
    { 
     Write-Host "You did not enter a double with an integer and a fractional part (eg. 10.6)" 
     Exit 
    } 
} 

GetVersion (Read-Host 'Enter program version') 
Write-Host $integralPart 
Write-Host $fractionPart 

При этом, я надеялся, что $ integralPart и $ fractionalPart будут содержать мои числа, при этом они соответствуют значениям, которые они должны

Может ли кто-нибудь объяснить, как это можно сделать?

+0

Какой результат вы получите? –

+2

Проблема в том, что переменные внутри функции не те, которые вы указали в верхней части. Используйте решения из [powershell, устанавливающего глобальную переменную из функции, где глобальное имя переменной является переменной, переданной функции) (http://stackoverflow.com/questions/12535419/powershell-setting-a-global-variable-from- a-function-where-the-global-variable-n) –

+0

А, должно быть проверено. $ matches [0] на самом деле DOES содержит правильные значения .... но я все равно должен что-то делать не так, поскольку $ integPart и $ fractionPart все же заканчиваются значениями, которые они инициализировали с помощью –

ответ

3

Вы должны сказать PS, что переменные из глобального масштаба с $global:

$integralPart="A" 
$fractionPart="B" 

function GetVersion { 
    param([string]$strVersion) 
    $integralPattern="^[0-9]+(?=\.)" 
    $fractionalPattern="(?<=\.)[0-9]+$" 

    #Check if string consists of an integral and fractional part 
    If ($strVersion -match $integralPattern -eq $True -and $strVersion -match $fractionalPattern -eq $True) 
    { 
     $strVersion -match $integralPattern 
     $global:integralPart = $matches[0] // SEE HERE 

     $strVersion -match $fractionalPattern 
     $global:fractionPart = $matches[0] // SEE HERE 
    } 
    else 
    { 
     Write-Host "You did not enter a double with an integer and a fractional part (eg. 10.6)" 
     Exit 
    } 
} 

GetVersion "10.6" 
Write-Host $integralPart 
Write-Host $fractionPart 

Выход:

True 
True 
10 
6 

Кроме того, у вас есть опечатка: внутри GetVersion, у вас есть $fractionalPart время глобальная переменная называется $fractionPart.

+1

Для таких вещей я поклонник кастинг шаблона RegEx как типа '[RegEx]', а затем выполнение '$ global: integPart = $ integPattern.Matches ($ strVersion) .value' типа вещей. Сохраняет дополнительный «True» выход. – TheMadTechnician

+0

@ TheMadTechnician: Я вижу, но это потребует дополнительных изменений с кодом, я не уверен, что OP этого хочет. Кстати, я думаю, вы имели в виду '.Match' (а не' .Matches'). @Bo Visfeldt: Это работает для вас? –

+0

Вместо использования глобалов вы могли бы сэкономить много боли в будущем, добавив переменные в качестве параметров функции. Это также увеличивает возможности повторного использования функций. – Bluecakes