Регулярное выражение Powershell, чтобы получить строку между строкой и символом - PullRequest
0 голосов
/ 26 октября 2018

У меня есть файл с некоторыми переменными в нем, как это:

${variable}

И я хочу перебрать файл и вывести:

variable
variable1
variable2
variable3

и т.д.

Мой код:

function GetStringBetweenTwoStrings($firstString, $secondString, $importPath){

    #Get content from file
    $file = Get-Content $importPath

    #Regex pattern to compare two strings
    $pattern = "$firstString(.*?)$secondString"

    #Perform the opperation
    $result = [regex]::Match($file,$pattern).Groups[1].Value

    #Return result
    return $result

}

GetStringBetweenTwoStrings -firstString "\\${" -secondString "}" -importPath ".\start.template"

ПРИМЕР строки входного файла:

<input id="paymentMethod_VISA" type="radio" name="${input.cardType}" value="VISA" checked="checked" style="width: 1.5em; height: 1.5em;"/>

Кто-нибудь может дать мне подсказку?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я предоставил альтернативную реализацию, предложенную @Theo:

Сценарий:

$path = ".\file.txt"
$content = Get-Content -Path $path -Raw
$m = $content | Select-String -pattern '\${(?<variable>[^}]+)}' -AllMatches
$m.matches.groups | Where-Object {$_.Name -eq "variable"} | ForEach-Object {Write-Output $_.Value}

Входной файл:

<input id="paymentMethod_VISA" type="radio" name="${input.cardType}" value="VISA" checked="checked" style="width: 1.5em; height: 1.5em;"/> <input id="${input.second}" type="${input.third};"/>

Вывод:

input.cardType
input.second
input.third
0 голосов
/ 26 октября 2018

Я бы сделал это так:

function GetStringBetweenTwoStrings($firstString, $secondString, $importPath){
    #Get content from file
    $file = Get-Content $importPath -Raw

    #Regex pattern to compare two strings
    $regex = [regex] $('{0}(.*?){1}' -f [Regex]::Escape($firstString), [Regex]::Escape($secondString))

    $result = @()
    #Perform and return the result
    $match = $regex.Match($file)
    while ($match.Success) {
        $result += $match.Groups[1].Value
        $match = $match.NextMatch()
    }
    return $result
}

и вызов функции:

GetStringBetweenTwoStrings -firstString '${' -secondString '}' -importPath '<PATH_TO_YOUR_INPUT_FILE>'

Поскольку функция теперь заботится о том, чтобы экранирование строк не давало значений $firstString и $secondString, вам не нужно беспокоиться об этом при вызове функции. Кроме того, поскольку во входном файле может быть больше совпадений, функция теперь возвращает массив совпадений.

т.е.. если ваш входной файл содержит что-то вроде этого:

<input id="paymentMethod_VISA" type="radio" name="${input.cardType}" value="VISA" checked="checked" style="width: 1.5em; height: 1.5em;"/>
<input id="paymentMethod_OTHER" type="radio" name="${input.otherType}" value="Other" checked="checked" style="width: 1.5em; height: 1.5em;"/>

возвращенные совпадения будут

input.cardType
input.otherType
...