2010-02-22 48 views
1

我有一个这样的字符串:正则表达式,以消除匹配双括号分隔子

adfsdf dsf {{sadfsdfadf {{Infobox}} musical}} jljlk }} 

我想消除所有{{..}}子。我试图

\{\{.*\}\} 

消除{{sadfsdfadf{{Infobox}} musical}} jljlk }}但我想消除{{sadfsdfadf {{Infobox}} musical}},检查}}接近字符串的开始。

我该怎么做?

+0

注意,这会以奇怪的方式,如果有字符串,例如,在任何一种递归的失败:上运行'{{文字{{文本}}文字}}'会留下最后的'}该正则表达式}',尽管有两对'{{'和'}}。 – 2010-02-22 22:46:33

回答

3

使用惰性限定符:

\{\{.*?\}\} 
+0

这是不好的:在原始的例子中,它只会在“Infobox”后面的括号内,当它不应该的时候离开“musical}}”。 – 2010-02-22 23:15:50

+2

你可以继续运行直到字符串停止变化... – kejadlen 2010-02-23 00:53:00

+0

你可以继续运行这个所有你想要的,它永远不会做海报想要的。正如你即时看到你是否尝试过一次。 – 2010-02-23 00:56:41

1

这是一个相当不强表达\{\{[a-zA-Z\s]*\}\},将工作。

1

在一般情况下,这对于正则表达式是不可能的。你不能用正则表达式匹配平衡的括号或类似的东西 - 你需要一个上下文无关的语法。

也就是说,Perl有一些用于递归正则表达式的设施;这些可以让你做你想做的事。我不知道Ruby是否有能力做同样的事情。

1

这是一个使用最近1.9.x Ruby版本的简单示例。如果您运行1.8.x版本,则需要使用oniguruma宝石。这不包括转义的\{\{,但确实处理单个{},我假定您将忽略它。

#!/usr/bin/evn ruby 
# Old 1.8.x versions of Ruby you'll need the gem. 
# require 'oniguruma' 
require 'pp' 

squiggly = %r/ 
    (
    (?<squiggly>   # squiggly named group 
     \{\{    # start {{ 
     (?:    # non matching group 
      [^{}]   # anything not { or } 
      | \{[^{]  # any { not followed by { 
      | \}[^}]  # any } not followed by } 
      | \g<squiggly> # nested squiggly 
     )*    # zero or more times 
     \}\}    # end }} 
    )     # end of squiggly 
)/x 

string = 'adfsdf dsf {{sadfsdfadf {{Infobox}} musical}} jljlk }}' 
pp squiggly.match(string)[:squiggly] #=> {{sadfsdfadf {{Infobox}} musical}} 
+0

好的!我*认为*我听说Oniguruma有递归匹配。那里有没有好的英文文档?标准功能列表在它开始变得有趣时就会变成乱码:http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt: -/ – 2010-02-24 00:27:16

+0

对不起,我所知道的关于oniguruma的所有信息都是从我那里得到的页面或实践中。 – shanna 2010-02-24 04:56:27