2012-01-17 98 views
0

給出一個字符串,像這樣:給定一個字符串,如何匹配4個空格的所有實例並替換?

Normal P start 

<pre><code> 
     feed &lt;&lt; feed_item.attributes.merge({ 
      :photo_url = "XXX", 
      :full_name ="XXX", 
      :meta = "XXX" 
     }) 
</code></pre> 

Normal P End 

我想找到的4個空格所有情況下,<pre><code>標籤內,然後用''替換那些比賽。

這是我到目前爲止有:

http://rubular.com/r/Zs6RY3AFXp

建議?關於如何做到這一點紅寶石?

修訂試圖削減用於標記爲代碼的4位前

輸出:

<div class="message">Normal P start 

<pre><code>  feed &lt;&lt; feed_item.attributes.merge({ 
      :photo_url =&gt; "XXX", 
      :full_name =&gt; "XXX", 
      :meta =&gt; "XXX" 
     }) 
</code></pre> 
Normal P end</div> 

回答

1

我敢肯定有一種方法用一個正則表達式來做到這一點,但我「M足夠不耐煩做稍貴方式:

str.match(/(<pre><code>)(.*)(<\/code><\/pre>)/) 
head = $1 
sub_str = $2 
tail = $3 
sub_str.gsub!(' ','') 
str = [head, sub_str, tail].join 
+0

謝謝,但你在哪裏定義$ 1 $ 2 $ 3? – 2012-01-17 20:59:08

+1

我不是。或者說,我是通過調用'.match'來實現的。當你做一些涉及正則表達式的東西時,它們就是全局變量,比如match()。 $ 1是'最後一個正則表達式匹配的第一件事',$ 2是第二個,等等。 – MrTheWalrus 2012-01-17 21:15:49

+0

確定通過執行x = str.match ....然後x [1]等工作...問題是正在刪除前/代碼塊之外的所有內容。這是不希望的。這個想法只是爲了清理裏面的東西? – 2012-01-17 21:27:16

1
string = <<EOS 
<div class="message">Normal P start 

<pre><code>  feed &lt;&lt; feed_item.attributes.merge({ 
      :photo_url =&gt; "XXX", 
      :full_name =&gt; "XXX", 
      :meta =&gt; "XXX" 
     }) 
</code></pre> 
Normal P end</div> 
EOS 

puts string.gsub(/<pre><code>(.*)<\/code><\/pre>/m) { $&.gsub(/(?<=<pre><code>)\s*/, "\n").gsub(/^\s{4}/, '') } 
+0

謝謝你的問題是,如果一行有6個空格,第二行有另外8行,它會被匹配兩次,搞亂了格式化。你怎麼能告訴正則表達式匹配最多每行一次? – 2012-01-17 21:44:14

+1

@Rachela你能不能在你原來的問題中顯示出來?只需編輯你的問題,以便我知道你的意思 – maprihoda 2012-01-17 21:51:12

+0

在問題中更新了,我試圖將它移動到左側,現在我知道它是代碼,我不需要縮進。如果得到第一行的縮進然後從所有行中修剪它,那將會很好嗎? – 2012-01-17 23:02:54

相關問題