0

バックグラウンド:

いくつかの XML ファイルを処理するために使用している PowerShell スクリプトがあります。これらの XML ファイルには、 「トークン」「フィルター」が埋め込まれています。トークンはスクリプトで解決され、フィルターは前のトークン評価の解決された値に適用されます。

トークンは次のように定義されます。

{!#T#TokenName#T#!}

フィルターは次のように定義されます。

{!#F#フィルター名#F#!}

一部のトークンとフィルターには'parameters'があり、すべてのパラメーターは独自のパラメーター マーカーにあり、すべてのパラメーターは明示的に名前を付ける必要があります。3 つの等号文字でパラメーター名とパラメーター値を区切ります。

{!#P#ParamName===ParamValue#P#!}

たとえば、次の「RegVal」トークンには、「RegKey」と「Name」の 2 つのパラメーターがあります。

{!#T#RegVal{!#P#RegKey===RegKeyPath#P#!}{!#P#Name===RegValName #P#!}#T#!}


問題

トークンを処理し、パラメーターを使用してフィルター処理する作業システムを既に取得しています (XML タグを囲んでいる文字列を抽出した後)。最初に、以下のように正規表現を使用して個々のトークンを識別します。

(?si){!#T#((?:(?!{!#T#.*#T#!}).)*)#T#!}

...問題は、次のような他のトークン内にトークンを埋め込みたいことです。

{!#T#ContainingToken{!#P#ParamName==={!#T#RegVal{!#P#RegKey===HKLM:\SOFTWARE\TestKey#P#!}{!#P#Name=== TestEntry#P#!}#T#!}#P#!}#T#!}

上記の正規表現は適切ではありません。私は正規表現の専門家ではなく、上記の正規表現を行うのに十分な問題があったため、助けを求める時が来ました。

これは、調整された正規表現で可能になると思いますか? 次の制限は完全に許容されます。

-1つだけ深く埋め込みます。

-パラメータ値内への埋め込みのみ (つまり、 === の後)

-パラメーターの 2 回目のパスで、含まれているトークンとフィルターを明らかにします。

参考までに、PowerShell フラグメントは次のとおりです。

function Get-Matches($pattern)
{
    begin { 
        Try {
            $regex = New-Object Regex($pattern)
        }
        Catch {
            Throw "Get-Matches: Pattern not correct. '$pattern' is not a valid regular expression."
        }
    }
    process { 
        foreach ($match in ($regex.Matches($_)))
        {
            ([Object[]]$match.Groups)[-1].Value
        }
    }
}

function Get-ParsedInput([String] $rawValue)
{
    $intermediateValue = $rawValue  
    $tokenMatches = @($intermediateValue | Get-Matches '(?si){!#T#((?:(?!{!#T#.*#T#!}).)*)#T#!}') # Wrapped as array...
    if ($tokenMatches.Count -gt 0)
    {
        $i=1
        $tokens = @{ }

        foreach ($tokenTextWithParms in $tokenMatches)
        {
            # ...from here I instantiate new token instance...
4

2 に答える 2

1

ネストされたパターンに関しては、通常、正規表現は「カウント」を処理できない文法に由来するため、そのためのツールではありません。しかし、.NET (したがって PowerShell でも) では可能かもしれません。http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396452.aspxをご覧ください。おそらく他にもソースがあると思いますが、これは私が最初に見つけたものです。

于 2013-08-23T07:07:16.487 に答える