Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式难题-PowerShell(.NET正则表达式引擎)_.net_Regex_Powershell - Fatal编程技术网

正则表达式难题-PowerShell(.NET正则表达式引擎)

正则表达式难题-PowerShell(.NET正则表达式引擎),.net,regex,powershell,.net,Regex,Powershell,背景: 我有一个PowerShell脚本,用于处理一些XML文件。这些XML文件嵌入了“标记”和“过滤器”。令牌在我的脚本中得到解析,过滤器应用于前面令牌计算的解析值 令牌的定义如下: {!#T#TokenName#T#!} 过滤器的定义如下: {!#F#过滤器名称#F#!} 一些令牌和筛选器具有“参数”,所有参数都在其自己的参数标记中,并且所有参数都必须显式命名,三个相等字符将参数名称和参数值分开: {!#p#ParamName==ParamValue#p#!} 例如,以下“RegVal”标记

背景:

我有一个PowerShell脚本,用于处理一些XML文件。这些XML文件嵌入了“标记”“过滤器”。令牌在我的脚本中得到解析,过滤器应用于前面令牌计算的解析值

令牌的定义如下:

{!#T#TokenName#T#!}

过滤器的定义如下:

{!#F#过滤器名称#F#!}

一些令牌和筛选器具有“参数”,所有参数都在其自己的参数标记中,并且所有参数都必须显式命名,三个相等字符将参数名称和参数值分开:

{!#p#ParamName==ParamValue#p#!}

例如,以下“RegVal”标记有两个参数“RegKey”和“Name”:

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


问题

我已经有了一个工作系统来处理令牌和带有参数的过滤器(在我从封装的XML标记中提取了一个字符串之后)。我首先用正则表达式标识各个令牌,如下所示

(?si){!#T#((?:(?!{!#T#.*#T#!}).)*)#T#!}
…问题是我现在想在其他令牌中嵌入令牌,例如:

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

上面的正则表达式不合适,我不是正则表达式专家,我在做上面的正则表达式时遇到了很多麻烦,所以是时候寻求帮助了

我认为这将是可能的调整正则表达式?以下限值完全可以接受:

-只嵌入一个深度

-仅嵌入参数值内(因此在:==)

-第二次传递参数以显示任何包含的令牌和筛选器

对于ref,这里是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...

至于嵌套模式——一般来说,正则表达式不是用于嵌套模式的工具,因为它们源自无法处理“计数”的语法。但是在.NET中(因此在PowerShell中也是如此)这是可能的。看一看。可能还有其他来源,但这是我第一次浏览。

基于本文最后一个例子

我的结局是:

(?x) {!#T# ( (?> (?!{!#T#|#T##!})。 | {!#T#(?) | #T#!}(?) )* (?(深度)(?!) ) ##!}


…似乎足够有效,但目前还不是100%有效

@DavidBrabant谢谢,我当然不记得在大学里被教过乔姆斯基等级制度。我将不得不考虑regex的替代方案。谢谢,一旦我能走出嘈杂的办公室,你的链接和这个链接应该是我需要解决的全部问题。