我有一个这样的字符串:正则表达式,以消除匹配双括号分隔子
adfsdf dsf {{sadfsdfadf {{Infobox}} musical}} jljlk }}
我想消除所有{{..}}
子。我试图
\{\{.*\}\}
消除{{sadfsdfadf{{Infobox}} musical}} jljlk }}
但我想消除{{sadfsdfadf {{Infobox}} musical}}
,检查}}
接近字符串的开始。
我该怎么做?
我有一个这样的字符串:正则表达式,以消除匹配双括号分隔子
adfsdf dsf {{sadfsdfadf {{Infobox}} musical}} jljlk }}
我想消除所有{{..}}
子。我试图
\{\{.*\}\}
消除{{sadfsdfadf{{Infobox}} musical}} jljlk }}
但我想消除{{sadfsdfadf {{Infobox}} musical}}
,检查}}
接近字符串的开始。
我该怎么做?
使用惰性限定符:
\{\{.*?\}\}
这是不好的:在原始的例子中,它只会在“Infobox”后面的括号内,当它不应该的时候离开“musical}}”。 – 2010-02-22 23:15:50
你可以继续运行直到字符串停止变化... – kejadlen 2010-02-23 00:53:00
你可以继续运行这个所有你想要的,它永远不会做海报想要的。正如你即时看到你是否尝试过一次。 – 2010-02-23 00:56:41
这是一个相当不强表达\{\{[a-zA-Z\s]*\}\}
,将工作。
在一般情况下,这对于正则表达式是不可能的。你不能用正则表达式匹配平衡的括号或类似的东西 - 你需要一个上下文无关的语法。
也就是说,Perl有一些用于递归正则表达式的设施;这些可以让你做你想做的事。我不知道Ruby是否有能力做同样的事情。
这是一个使用最近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}}
好的!我*认为*我听说Oniguruma有递归匹配。那里有没有好的英文文档?标准功能列表在它开始变得有趣时就会变成乱码:http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt: -/ – 2010-02-24 00:27:16
对不起,我所知道的关于oniguruma的所有信息都是从我那里得到的页面或实践中。 – shanna 2010-02-24 04:56:27
注意,这会以奇怪的方式,如果有字符串,例如,在任何一种递归的失败:上运行'{{文字{{文本}}文字}}'会留下最后的'}该正则表达式}',尽管有两对'{{'和'}}。 – 2010-02-22 22:46:33