2016-11-22 39 views
2

我正在做一些代碼清理,並且需要確保我的gsub!僅在一小段代碼上運行。我需要檢查的代碼部分以{{Infobox television\{\{[Ii]nfobox\s[Tt]elevision爲技術)開頭,並以結尾的匹配雙括號「}}」。如何使用ruby和/或正則表達式抓取匹配括號內的所有文本

將要運行gsub!的一個例子是text.gsub!(/\|(\s*)channel\s*=\s*(.*)\n/, "|\\1network = \\2\n")

... 
{{Infobox television 
| show_name   = 60 Minutos 
| image    = 
| director    = 
| developer   = 
| channel    = [[NBC]] 
| presenter   = [[Raúl Matas]] (1977–86)<br />[[Raquel Argandoña]] (1979–81) 
| language    = [[Spanish language|Spanish]] 
| first_aired   = {{Date|7 April 1975}} 
| website    = {{url|https://foo.bar.com}} 
}} 
... 

注:

  • 使用sub代替gsub是不是一種選擇,由於這樣的事實的多個實例可能存在需要替換的參數。
  • 我不能只查找}}的第一組,因爲可能有多組,如上例所示。
+0

嘗試[/(?= \ {\ {\ nfobox \ s [Tt] elevision)(\ {\ {(?> [^ {}] ++ | \ g <1>)*}}) /'](http://rubular.com/r/ev0o128Uzk)。 –

+0

@WiktorStribiżew發表了這個答案!工作! – Zack

+0

只需一秒鐘,就能處理它 –

回答

1

您可以使用正則表達式帶着幾分遞歸:

/(?=\{\{[Ii]nfobox\s[Tt]elevision)(\{\{(?>[^{}]++|\g<1>)*}})‌​/ 

或者,如果有單{}裏面,你將還需要匹配那些(?<!{){(?!{)|(?<!})}(?!})

/(?=\{\{[Ii]nfobox\s[Tt]elevision)(\{\{(?>[^{}]++|(?<!{){(?!{)|(?<!})}(?!})|\g<1>)*}})/ 

查看Rubular demo

詳情

  • (?=\{\{[Ii]nfobox\s[Tt]elevision) - 正先行確保的當前位置隨後與{{Infobox television像字符串(具有不同的外殼)
  • (\{\{(?>[^{}]++|\g<1>)*}})‌​ - 第1組,以下相匹配:
    • \{\{ - 一個{{
    • (?>[^{}]++|\g<1>)* - 零次或多次出現:
    • [^{}]++ - 除012以外的1個或多個字符和}
    • (?<!{){(?!{) - 一個{未括與其他{
    • (?<!})}(?!}) - 或
    • \g<1> - - 一個}不與其他}
    • |包圍的整個第1點的子模式
    • }} - 一個}}子串
+0

哇。只是哇。在我頭上,但這是非常有用的。真的很欣賞故障。 – Zack

0

如果不花很多時間就不能給你一個直接的答案。

但值得注意的是,第一個括號集是在一行的開頭,就像最後一個。

所以,你必須

^{{(.*)^}}$/m 

m意味着多比賽。這將匹配括號之間的一切 - 括號()意味着你可以拉出來什麼花括號內的匹配,例如:

string = <<_EOT 
{{Infobox television 
| show_name   = 60 Minutos 
| image    = 
| director    = 
| developer   = 
| channel    = [[NBC]] 
| presenter   = [[Raúl Matas]] (1977–86)<br />[[Raquel Argandoña]] (1979–81) 
| language    = [[Spanish language|Spanish]] 
| first_aired   = {{Date|7 April 1975}} 
| website    = {{url|https://foo.bar.com}} 
}} 


_EOT 

matcher = string.match(^{{(.*)^}}$/m) 

matcher[0]會給你整個表達式

matcher[1]會給你()括號內匹配的是什麼

這樣做的危險在於它會執行「貪婪」匹配並匹配它所能夠處理的最大文本,因此您必須將其關閉。沒有關於你想要做什麼的更多信息,我不能再幫忙了。

注意 - 要匹配()括號,您必須將其轉義。有關更多信息,請參見https://ruby-doc.org/core-2.1.1/Regexp.html

+0

由於'}} $'匹配倒數第二行('foo.bar.com}}'),因此無法正常工作。如果塊中的前一行以'}}結尾,則該塊的其餘部分將不存在於該匹配中。 –

+0

@Jordan在我重新閱讀之後,我意識到。已將RE更改爲^ {{(。*)^}} $/m – Ghoti

相關問題