我有一個這樣的字符串:正則表達式,以消除匹配雙括號分隔子
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