2016-09-28 103 views
3

我期待在SCSS較少混入的電話轉換爲它們的等價物:正則表達式替換,以較少混入轉換爲SCSS

  1. .mixin();應該成爲@mixin();
  2. .mixin(0);應該成爲@mixin(0);
  3. .mixin(0; 1; 2);應該成爲@mixin(0, 1, 2);

我遇到了最困難的第三個例子,因爲我基本上需要匹配n以分號分隔的組,並用由逗號分隔的相同組替換它們。我想這依賴於某些我不熟悉的正則表達式中的重複組功能。

簡單地替換paren中的分號並不簡單 - 我需要一個只能匹配mixin的\.[\w\-]+\(.*\)格式的正則表達式,但顯然在第二個匹配組中有一些魔法來處理上面的第三個示例。

我在Ruby中這樣做,所以如果你能夠提供與gsub兼容的替代語法,那就太棒了。 我想要一個正則表達式替換,它不需要多次傳遞來清理分號。

+0

感謝迄今爲止的答案。如果沒有兩次通過gsub,沒有辦法做到這一點? – swrobel

回答

0

我建議增加兩個捕獲組圓你所需要的子值,並在第一gsub塊使用附加gsub僅在第二組的;,更換。

參見

s = ".mixin(0; 1; 2);" 
puts s.gsub(/\.([\w\-]+)(\(.*\))/) { "##{$1}#{$2.gsub(/;/, ',')}" } 
# => #mixin(0, 1, 2); 

圖案細節:

  • \. - 字面點
  • ([\w\-]+) - 第1組捕捉1個或多個字字符([a-zA-Z0-9_])或-
  • (\(.*\)) - 第2組捕獲(,然後除lineb以外的任何0+字符reak符號儘可能多,直到最後的)和最後的)注意:如果有多個值,請使用延遲匹配 - (\(.*?\)) - 此處。
+0

另外,請參閱[本在線演示](http://www.tutorialspoint.com/execute_ruby_online.php?PID=0Bw_CjBb95KQMUkFROTlJbmVjTTA)。另外,要支持組2中的*均衡*括號,您可能需要將組2模式更改爲'(\((?:[^()] ++ | \ g <2>)* \))''。看[這個Rubular演示](http://rubular.com/r/mXy2sEpnyV)。 –

+0

你的答案我認爲是最接近的,但這裏有什麼不對, 「mixin」是sass(輸出)中的一個關鍵字,而不是輸入。 輸入中的單詞「mixin」可以是任何值。 但輸出必須包含關鍵字@mixin。 – mosid

+0

輸出中的mixin以「@」而不是「#」開始 – mosid

0

在這裏你去:

less_style = ".mixin(0; 1; 2);" 

# convert the first period to @ 
less_style.gsub! /^\./, '@' 

# convert the inner semicolons to commas 
scss_style = less_style.gsub /(?<=[\(\d]);/, ',' 

scss_style 
# => "@mixin(0, 1, 2);" 

第二個正則表達式爲正數,lookbehinds。你可以閱讀那些在這裏:http://www.regular-expressions.info/lookaround.html

我也用這個整潔的web應用程序玩弄的正則表達式:http://rubular.com/

0

這將讓你通過GSUB單程:

".mixin(0; 1; 2);".gsub(/(?<!\));|\./, ";" => ",", "." => "@") 
=> "@mixin(0, 1, 2);" 

這是一個OR用正則表達式替換參數的散列。

從你的榜樣,你只是要替換分號不緊跟括號(負回顧後)假設:(?<!\));

您可以修改/與其他表達式擴大戰果。甚至爲正則表達式添加更多的OR條件。

另外,如果您需要更多選項,則可以使用gsub的塊版本。