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

1 つの ' を単純に 2 つの '' に置き換えてみませんか。

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