我有一个这样的字符串:
adfsdf dsf {{sadfsdfadf {{Infobox}} musical}} jljlk }}
我要删除所有{{..}}
子字符串。我试过了
\{\{.*\}\}
取消{{sadfsdfadf{{Infobox}} musical}} jljlk }}
,但我想要消除{{sadfsdfadf {{Infobox}} musical}}
,检查}}
是否接近子字符串的开头。
我该怎么做?
答案 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}}