2013-06-25 70 views
4

我偶然发现了一个我无法解决的正则表达式问题。我想匹配一个配置文件的一部分,但只有当它包含一个特殊的词:如果匹配包含特殊字匹配的正则表达式

{{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}} 

在这里,我想其中包含“specialword”

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

通过玩弄整个块匹配一些图案我实现了与lookarounds直接opposit“所有不包含spacialword”,而不是opposit,我想:/

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

要清楚,我想

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

其中符合

[\s\S]*? 

部分必须包含 “specialword” 相匹配的整个表达式

+0

这是一个XML文件吗?如果没有,坚持用'({{START}} [\ s \ S] *?specialword [\ s \ S] *?{{END}})' –

+0

@RubensFarias:这将无法正常工作。在上面的例子中,它将匹配前两个组。 –

+0

@RubensFarias:我做了同样的错误;) –

回答

4

你在正确的轨道上是一种与lookahead assertions

{{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}} 
+0

感谢您的超级解释!我脑子里有这样的事情,但不知道如何表达。我想我必须深入研究那个(?:)的东西。我真的很感谢你的简短而确切的答案! –

相关问题