2014-06-25 141 views
2

我試圖用{{和}}使用正則表達式替換charaters

例例如

"this is a     gap {{  for user in users }}" => 
"this is a     gap {{ for user in users }}" 

我的出現之間的實際空間,以取代HTML實體空格之間可選的比賽「已經發現了類似的答案,從而促使我寫這樣的事情(不工作)

.gsub(/(?<=\{\{).*(&nbsp;?).*(?=\}\})/,' ') 

這樣的正則表達式的任何幫助,將不勝感激感謝!

+0

你只想在{{大括號}}之間進行替換,對吧? – zx81

+0

只用{{}} – Dandan

回答

0

單呼到GSUB使用\K\G

這是一個有點棘手,但在Ruby中2.0+,我們可以用正則表達式緊湊多虧了\K\G令牌做到這一點。使用此正則表達式,並用空格代替:

[^{}]*\K(?:{{|\G).*?\K&nbsp;(?=[^{]*}) 

demo

在Ruby:

result = subject.gsub(/[^{}]*\K(?:{{|\G).*?\K&nbsp;(?=[^{]*})/, ' ') 

說明

  • [^{}]*比賽未牙套
  • \K告訴引擎砸什麼只是匹配
  • (?:{{|\G)或匹配任何字符開幕式表明我們是定位在最後一場比賽後
  • .*?\K懶洋洋地匹配字符(並將它們丟棄),最多可以輸入
  • &nbsp;我們的比賽!
  • 其中,作爲lookakead (?=[^{]*})斷言,必須跟那些不開括號滿足一個右括號前
2

你可以用一個複雜的正則表達式我同意這樣做,但我覺得它的任何字符更易於使用嵌套替代。首先使用gsub查找括號內的子字符串,然後使用另一個替換實體。

string = 'this is a &nbsp;&nbsp;&nbsp; gap {{ &nbsp;for user in&nbsp;users&nbsp;}}' 
result = string.gsub(/{{.*?}}/){ |s| s.gsub(/&nbsp;/, ' ') } 
# => "this is a &nbsp;&nbsp;&nbsp; gap {{ for user in users }}" 
+0

之間的空格替換' '爲了向他闡明,此解決方案(其工作原理)鏈接了兩個連續的替換操作。 – zx81