2012-10-04 31 views
1

是否有可能使一个正则表达式匹配单括号内的一切却忽略了双括号,所以例如:正则表达式匹配单个支架对而不是双支架对

{foo} {bar} {{baz}} 

我想匹配富和酒吧,但不巴兹?

+0

您使用哪种语言? –

+0

对不起,应该说。 JavaScript的。 – stovroz

+1

@stovroz:无赖。那么你没有看后面的断言。 –

回答

6

要只匹配foobar周围无支撑,则可以使用

(?<=(?<!\{)\{)[^{}]*(?=\}(?!\})) 

如果你的语言支持后向断言。

说明:

(?<=  # Assert that the following can be matched before the current position 
(?<!\{) # (only if the preceding character isn't a {) 
\{  # a { 
)   # End of lookbehind 
[^{}]* # Match any number of characters except braces 
(?=  # Assert that it's possible to match... 
\}  # a } 
(?!\}) # (only if there is not another } that follows) 
)   # End of lookahead 

编辑:在JavaScript中,你不必回顾后。在这种情况下,您需要使用如下所示的内容:

var myregexp = /(?:^|[^{])\{([^{}]*)(?=\}(?!\}))/g; 
var match = myregexp.exec(subject); 
while (match != null) { 
    for (var i = 0; i < match.length; i++) { 
     // matched text: match[1] 
    } 
    match = myregexp.exec(subject); 
} 
+0

看起来不错,在你的JavaScript版本中做?我的真实世界主题碰巧在括号之前包含一个:{foo},并且冒号在不应该出现时匹配。 – stovroz

+0

报废。冒号是一只红鲱鱼。 {之前的字符总是被拉进来。 – stovroz

+0

@stovroz:的确如此。顺便说一下,我对正则表达式做了一个小的编辑,如果两套大括号彼此直接相邻,现在也可以工作。 –

3

在许多语言中,你可以使用环视断言:

(?<!\{)\{([^}]+)\}(?!\}) 

说明:

  • (?<!\{):前一个字符是不是{
  • \{([^}]+)\}:一些大括号,例如内{foo}
  • (?!\}):以下文字是不是}
+0

添加'\ s'来排除花括号内的空格:'(?<!\ {} \ {([!\ s}] +)\}(?!\})' –

相关问题