0

背景:

我有一个 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...
4

2 回答 2

1

至于嵌套模式 - 通常正则表达式不是工具,因为它们源自无法处理“计数”的语法。但在 .NET 中(因此也在 PowerShell 中)它可能是可能的。看看http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396452.aspx。可能还有其他来源,但这是我遇到的第一个来源。

于 2013-08-23T07:07:16.487 回答
0

基于这篇博文中的倒数第二个例子……</p>

http://blog.stevenlevithan.com/archives/balancing-groups

我最终得到了这个:

(?x) {!#T# ( (?> (?! {!#T# | #T#!} ) . | {!#T# (?) | #T#!} (?<-Depth> ) )* (?(深度)(?!)) ) #T#!}

…似乎工作得很好,但目前还不是 100% 为什么!

于 2013-08-28T06:48:23.947 回答