2

解決できない正規表現の問題に出くわしました。構成ファイルの一部を一致させたいのですが、特殊な単語が含まれている場合のみ:

{{START}}
    {{CONF1}}blah blah ..{{ENDCONF1}}
    {{CONF2}}blah blah ..{{ENDCONF2}}
{{END}}

{{START}}
    {{CONF1}}blah blah ..{{ENDCONF1}}
    {{CONF2}}blah specialword ..{{ENDCONF2}}
{{END}}

{{START}}
    {{CONF1}}blah blah ..{{ENDCONF1}}
    {{CONF2}}blah blah ..{{ENDCONF2}}
{{END}}

ここでは、「特別な単語」を含むブロック全体に一致させたい

{{START}}
    {{CONF1}}blah blah ..{{ENDCONF1}}
    {{CONF2}}blah specialword ..{{ENDCONF2}}
{{END}}

いくつかのパターンをいじることで、「空間語を含まないすべて」のルックアラウンドで正反対を達成しましたが、私が望む反対は達成しませんでした:/

{{START}}((?!specialword)[\s\S])*?{{END}}

はっきりさせたい

{{START}}[\s\S]*?{{END}}

一致する部分

[\s\S]*?

式全体に一致する「特殊語」を含める必要があります

4

1 に答える 1

4

あなたは先読みアサーションで正しい軌道に乗っています:

{{START}}(?:(?!{{END}})[\s\S])*specialword(?:(?!{{END}})[\s\S])*{{END}}

説明:

{{START}}      # Match {{START}}
(?:            # Match...
 (?!{{END}})   # ...as long as we haven't reached {{END}} yet:
 [\s\S]        # any character
)*             # any number of times.
specialword    # Match "specialword"
(?:            # Match (as before)...
 (?!{{END}})   # whatever follows, unless it's {{END}}
 [\s\S]
)*
{{END}}        # Then finally match {{END}}
于 2013-06-25T11:17:31.827 に答える