背景:
我有一个 PowerShell 脚本,用于处理一些 XML 文件。这些 XML 文件嵌入了'tokens'和'filters'。令牌在我的脚本中得到解析,过滤器应用于前面令牌评估的解析值。
令牌定义如下:
{!#T#TokenName#T#!}
过滤器定义如下:
{!#F#FilterName#F#!}
一些标记和过滤器具有'parameters',所有参数都在它们自己的参数标记中,并且所有参数必须明确命名,三个相等字符分隔参数名称和参数值:
{!#P#ParamName===ParamValue#P#!}
例如,下面的“RegVal”令牌有两个参数“RegKey”和“Name”:
{!#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#!}
上面的正则表达式不合适,我不是正则表达式专家,我在做上面的正则表达式时遇到了很多麻烦,所以是时候寻求帮助了。
我认为这可以通过调整正则表达式来实现吗?以下限制是完全可以接受的:
- 只嵌入一个深度。
- 仅嵌入在参数值中(所以在: === 之后)
-第二次传递参数以显示任何包含的标记和过滤器。
对于参考这里是 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...