2012-12-18 28 views
0

我有一種情況,可以避免將用戶提供的字符串注入PowerShell代碼。雖然我確實有正確的轉義代碼(複製每個引用,並且單引號字符串的powershell接受5個不同的引號字符,包括智能引號,但現在讓我們假設它接受' 我想要做的是有一個正則表達式我是否該字符串是正確轉義,和逃避被如下加引號這樣的字符串進行與DOTNET REGEX匹配正確轉義引號

hello ' there 

是壞的,而

hello '' there 

安全

然而3引號(或5 Ø因爲r 7等)也差這麼

hello ''' there 

也是危險

所以我試圖找到一個正則表達式可以驗證該字符串是正確轉義,在不存在奇數單引號圖案。

我知道與標準的正則表達式計數組,這是不可能的,但與dotnet捕獲組,我希望做這樣的事情。

('\b(?<DEPTH>)|\b'(?<-DEPTH>)|[^']*)*(?(DEPTH)(?!)) 

但我不能得到它的工作。

回答

6

只是因爲它是你,@klumsy:

"(?ix:     # ignore whitespace and comments 
    ^    # start at the beginning 
    (?(D)    # if 'D' is defined... 
     (?<-D>')  # match a quote and undefine D 
     |    # otherwise 
     (?: 
      (?<D>') # match a quote and define D 
      | 
      [^']  # or match anything else 
      ) 
    )+     # as many times as we can 
    (?(D)    # if 'D' is STILL defined... 
     ($!)   # then don't match 
     |    # otherwise 
     [^']*   # match anything except ' 
    )$     # all the way to the end 
)" 

這隻會匹配這些字符串,它總是有雙引號,但不包括出現單引號或奇數引號的字符串。據我所知,只適用於.Net正則表達式。

只要您刪除所有空格和註釋,您當然可以省略第一行和最後一行。

+0

這個正則表達式既艱鉅又美觀。它的工作原理! – klumsy

+0

這裏是壓縮版本 ^(?(D)(?<-D>')|(?:(?')| [^']))+(?(D)($!)| [^'] * )$ – klumsy

0

爲什麼不能簡單地取代一個「有兩個‘’:

> $a = read-host 
foo ' bar 
> $a 
foo ' bar 
> $a -replace "'","''" 
foo '' bar 
+0

我已經有了廣泛的代碼,我可以在別處運行以消毒輸入。然而,在這種情況下,我沒有機會進行預先安排,只能根據REGEX過濾它,並且如果它通過了該正則表達式,那麼它將被直接注入到代碼中。 – klumsy