2016-09-28 99 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的块版本。