Регулярное выражение powershell для получения строки между строкой и символом

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

${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;"/>

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

Спасибо

Пытаюсь определить полезность этой функции. Обычно соответствие шаблону уже происходит между строками (строка - это просто массив символов).

Joseph 26.10.2018 09:29

да, но проблема вовсе не в этом. Я просто не могу взять «переменную» из этого «паттерна»

Martin Fric 26.10.2018 09:33

вы имеете в виду Get-Content $ importPath | ? {строковый объект -match "\\ $ {(. *?)}"}

Martin Fric 26.10.2018 09:38

Я пробовал этот Get-Content ". \ VoiceGB_start.template" | ? {$ _ -match "` $ {(. *?)} "}, но с пустым результатом

Martin Fric 26.10.2018 09:47

Можете ли вы опубликовать то, что находится в вашем файле?

Joseph 26.10.2018 09:50

См. Пример ввода

Martin Fric 26.10.2018 09:53

Итак, из всей этой строки вы хотите захватить ${input.cardType} или input.cardType? Похоже, вам нужен input.cardType. Просто пытаюсь проверить, прежде чем продолжить работу.

Joseph 26.10.2018 10:06

Входной файл в определенном формате, например. xml / json файл? Если да, может быть, было бы проще прочитать и проанализировать его с помощью специального синтаксического анализа, например. xml парсинг - stackoverflow.com/questions/18032147/…

tukan 26.10.2018 10:10
0
8
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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
}

и вызовите функцию te:

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

@MartinFric Добро пожаловать! Кстати, лучше переименовать функцию в Get-StringBetweenTwoStrings, чтобы она соответствовала соглашению об именах Powershell для функций и командлетов. Вы можете прочитать об этом здесь или там. Особенно когда делаете модуль и не хотите жаловаться PS ..

Theo 26.10.2018 12:15

Я представил альтернативную реализацию той, которую предложил @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

Другие вопросы по теме