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 回答