バックグラウンド:
いくつかの 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...