0

我有一种情况可以避免将用户提供的字符串注入到我的 PowerShell 代码中。虽然我确实有正确的转义代码(复制每个引号,并且带有单引号字符串的powershell接受5个不同的引号字符,包括智能引号,但现在让我们假设它接受'我想要做的是有一个正则表达式告诉我字符串是否被正确转义,转义是通过将引号加倍来完成的,因此字符串如下

hello ' there

坏的时候

hello '' there

是安全的

但是 3 个引号(或 5 个或 7 个等)也很糟糕,所以

hello ''' there

也很危险

所以我试图找到一个可以验证字符串是否正确转义的正则表达式,因为没有奇数单引号模式。

我知道像这样的标准正则表达式计数组是不可能的,但是对于 dotnet 捕获组,我希望做这样的事情。

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

但我无法让它工作。

4

2 回答 2

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 正则表达式。

当然,您可以省略第一行和最后一行,只要删除所有空格和注释即可。

于 2012-12-18T18:12:37.370 回答
0

为什么不简单地将一个 ' 替换为两个 '':

> $a = read-host
foo ' bar
> $a
foo ' bar
> $a -replace "'","''"
foo '' bar
于 2012-12-18T08:27:54.693 回答