2017-04-19 33 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