ruby - 将 Less mixins 转换为 Scss 的正则表达式替换

标签 ruby regex

我希望将 Less mixin 调用转换为它们在 Scss 中的等价物:

  1. .mixin(); 应该变成 @mixin();
  2. .mixin(0); 应该变成 @mixin(0);
  3. .mixin(0; 1; 2); 应该变成 @mixin(0, 1, 2);

我在第三个示例中遇到的困难最大,因为我基本上需要匹配用分号分隔的 n 组,并用逗号分隔的相同组替换它们。我想这依赖于我不熟悉的正则表达式中的某种重复组功能。

简单地替换 paren 中的分号是不够的——我需要一个只匹配 \.[\w\-]+\(.*\) 格式的 mixins 的正则表达式,但是显然在第二个匹配组中有一些魔法来处理上面的第三个例子。

我在 Ruby 中执行此操作,因此如果您能够提供与 gsub 兼容的替换语法,那就太棒了。 我想要一个单一的正则表达式替换,不需要多次传递来清理分号的东西。

最佳答案

我建议在您需要的子值周围添加两个捕获组,并在第一个 gsub block 中使用额外的 gsub 来替换 ;, 仅在第 2 组。

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

图案细节:

  • \. - 文字点
  • ([\w\-]+) - 第 1 组捕获 1 个或多个单词字符 ([a-zA-Z0-9_]) 或 -
  • (\(.*\)) - 第 2 组捕获 (,然后除换行符号外的任何 0+ 个字符尽可能多,直到最后一个 ) 和最后一个 )注意:如果有多个值,请使用惰性匹配 - (\(.*?\)) - 此处。

关于ruby - 将 Less mixins 转换为 Scss 的正则表达式替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757272/

相关文章:

arrays - 聊天中 Trolls 消息的 Ruby 过滤器(用重复值填充数组)

c++ - 当正则表达式匹配重叠时会发生什么?

Java正则表达式负先行替换非三重字符

Python正则表达式匹配日期

ruby-on-rails - Rails 集合排序无法按预期使用 UTF-8 字符串

ruby-on-rails - 从内存集合中删除项目

regex - FINDSTR 中 RegEx 字符串的多个实例

两个标签之间的 JavaScript 正则表达式多行文本

ruby - 是否有易于使用的 Ruby FTP 库?

ruby - 部署 Compojure/Sinatra 应用程序