2017-04-19 67 views
-2

我搜索正则表达式以从完整的PowerShell脚本中提取Powershell参数块。是否可以使用正则表达式解析PowerShell参数块

[CmdletBinding()] 
Param(
    [Parameter(Mandatory=$True,Position=1)] 
    [string]$computerName, 

    [Parameter(Mandatory=$True)] 
    [string]$filePath 
    ) 

... 

同事意味着不可能通过使用regualr表达式来解析此结构。他说正则表达式不能计算param块内的开始和结束符号(...),并且这使得解析param块不可能。

+1

我敢肯定它的可能性,但它会是一个复杂的正则表达式,有很多转义字符。你试过什么,你最终想达到什么样的产出? –

+3

请参阅[.NET正则表达式参考](https://msdn.microsoft.com/en-us/library/az24scfc(v = vs.110).aspx#Anchor_3):您可以使用平衡组结构。然而,正确的方法是使用AST解析器([示例](http://stackoverflow.com/a/42548383/3959875)) – wOxxOm

+1

是否有一个特殊原因_why_你甚至考虑在这里使用正则表达式而不是使用PowerShell的解析器? – Joey

回答

1

好消息:你的同事是错的。
确实简单的正则表达式存在嵌套数据的问题,但只有当您有无限级嵌套时才会出现问题。
这对这一问题的解释非常漂亮:How to match string within parentheses (nested) in Java?

在你的情况下,即使一个简单的正则表达式可以工作:

​​

Working example

此发现$parameters与他们之前的[attributes]块。涉及的嵌套很少。这是一个天真的正则表达式,如果你有评论,带括号的字符串等,它就会失败。但是正则表达式可以被扩展来支持这些情况。

一些积分:

+1

您的示例不包含可选参数的默认值 – Clijsters

+0

@Clijsters - 正确!当然不是,它不是一个完整的例子。我确实说过“这是一个天真的正则表达式,如果你有评论,带括号的字符串等,它就会失败。但是正则表达式可以扩展到支持这些情况。”这是一个*理论*是可能的问题,而不是一个实际的问题。 – Kobi