首页 > 解决方案 > 正则表达式(sass 变量)

问题描述

(Node.js) 我必须匹配文件中的所有 Sass 变量。但是我可以在一个文件中包含变量和混合。我需要更新常规表达式以不匹配来自 mixin 指令或来自 mixin / 函数内容(嵌套)的变量。

所以只有:

  1. $测试:真;
  2. $white: #fff !default;
  3. $sizes: (25: 0.25rem, 50: 0.5rem) !default;

正则表达式:/\$([^:]*)\s*:\s*([^;]*)\s*;/g

https://regex101.com/r/oRuWjS/1

$test: true;

$white: #fff !default;

$sizes: (
  25: 0.25rem,
  50: 0.5rem
) !default;

@mixin parent ($first, $second: "") {
  .#{$first} {
    @content;
  }
}

标签: node.jsregex

解决方案


使用

/@mixin[^(]*\([\s\S]*?^}$|\$([^:]*?)\s*:\s*([^;]*?)\s*;/gm

您可以从匹配@mixin}单独的一行,并跳过此匹配,否则收集您的其他匹配。请参阅正则表达式演示

var s = "$test: true;\n\n$white: #fff !default;\n\n$sizes: (\n  25: 0.25rem,\n  50: \n0.5rem\n) !default;\n\n@mixin parent ($first, $second: \"\") {\n  .#{$first} {\n    \n@content;\n  }\n}\n";
var rx = /@mixin[^(]*\([\s\S]*?^}$|\$([^:]*?)\s*:\s*([^;]*?)\s*;/gm;
var m, res = [];
while (m=rx.exec(s)) {
   if (m[1]) {
       res.push([m[1], m[2]]);
   }
}
console.log(res);

细节

  • @mixin[^(]*\([\s\S]*?^}$- 将被跳过的替代方案:
    • @mixin- 文字子串
    • [^(]*- 0+ 以外的字符(
    • \(- 一个(
    • [\s\S]*?- 尽可能少的任何 0+ 字符
    • ^}$-}一个单独的行
  • |- 或者
  • \$- 一个$字符
  • ([^:]*?)- 第 1 组:0+ 字符而不是:尽可能少的字符
  • \s*:\s*-:用 0+ 个空格括起来
  • ([^;]*?)- 第 2 组:0+ 字符而不是:尽可能少的字符
  • \s*;- 0+ 个空格,后跟;.

推荐阅读