正则表达式,用于删除通过匹配双括号分隔的子字符串

时间:2010-02-22 17:37:25

标签: ruby-on-rails ruby regex

我有一个这样的字符串:

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

我要删除所有{{..}}子字符串。我试过了

\{\{.*\}\}

取消{{sadfsdfadf{{Infobox}} musical}} jljlk }},但我想要消除{{sadfsdfadf {{Infobox}} musical}},检查}}是否接近子字符串的开头。

我该怎么做?

4 个答案:

答案 0 :(得分:3)

使用延迟量词:

\{\{.*?\}\}

答案 1 :(得分:1)

这是一个非常强大的表达式\{\{[a-zA-Z\s]*\}\},可以使用。

答案 2 :(得分:1)

在一般情况下,正则表达式无法实现这一点。你无法将平衡的括号或类似的东西与正则表达式匹配 - 你需要一个无上下文的语法。

也就是说,Perl有一些用于递归正则表达式的工具;这些将允许你做你想要的。我不知道Ruby是否能够做同样的事情。

答案 3 :(得分:1)

这是使用最近的1.9.x Ruby版本的快速示例。如果你运行1.8.x版本,你将需要oniguruma gem。这不会考虑转义\{\{但会处理单{},我认为您会忽略这些内容。

#!/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}}