2013-08-23 51 views
0

背景:正则表达式的难题 - PowerShell的(.NET正则表达式引擎)

我有我用来处理一些XML文件的PowerShell脚本。这些XML文件嵌入了'令牌''过滤器'。令牌在我的脚本中得到解决,并且过滤器应用于解析之前令牌评估的值。

令牌定义如下:{!#T#TokenName#T#}

筛选器等被定义:{!#F#FILTERNAME#F#}

一些令牌和过滤器有'参数',所有参数都在它们自己的参数标记中,ALL参数s必须明确命名,3平等字符单独的参数名称和参数值:{!,#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 === {#ŧ #RegVal {P | REGKEY === HKLM:!\ SOFTWARE \密押,#P#} {!,#P#名称===的TestEntry,#P#}!#T#},#P#}#T# !}

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

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

-embedding只有一个深。

参数值内-only嵌入(如此后:===)的参数来揭示

-a第二遍中包含的任何令牌和过滤器。

对于裁判这里是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... 
+1

http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html –

+0

@DavidBrabant谢谢,我当然不记得在大学里被教授乔姆斯基层次结构。我将不得不考虑替代正则表达式。 – Darren

回答

0

基于本博客文章倒数第二个例子......

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

我结束了与此:(?X)!?

{#T# ( (> (?!{#T#|!#T#!}) |。 {!#T# (?)|! #T#}(?< -depth>) )* (?(深度)(?)) ) #T#!}

...似乎足够的工作,目前还没有100%的原因,但!

1

至于嵌套模式 - 一般的正则表达式是不是因为他们从语法不能处理“计数”出身的工具。但在.NET中(因此也在PowerShell中)可能是可能的。看看http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396452.aspx。也许还有其他来源,但这是我第一次跑过去。

+0

谢谢,一旦我能离开嘈杂的办公室,我的需要解决的就是你的链接和链接。 http://stackoverflow.com/a/17004406/329367 – Darren