2010-02-22 71 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