LESS/javascript:将regexp对象转换为整数(计算)

LESS/javascript:将regexp对象转换为整数(计算),javascript,regex,less,eval,mixins,Javascript,Regex,Less,Eval,Mixins,我想转换供应商前缀渐变的背景位置,因此我使用了一个简单的公式90-(@degree),根据这个例子,它应该是90-(135)=-45 重要的部分是。replace(/(\d*)?deg/g,90-'$1'+'deg'),我尝试了不同的功能,但无论如何,输出结果总是以NaN结尾: -parseInt(“$1”) -parseFloat(“$1”) -评估(90-‘1美元’) -编号(“$1”) 如果我用'135'或任何其他数字替换'1',效果会很好 @w3c: true; // v

我想转换供应商前缀渐变的背景位置,因此我使用了一个简单的公式
90-(@degree)
,根据这个例子,它应该是
90-(135)=-45

重要的部分是
。replace(/(\d*)?deg/g,90-'$1'+'deg')
,我尝试了不同的功能,但无论如何,输出结果总是以NaN结尾: -parseInt(“$1”) -parseFloat(“$1”) -评估(90-‘1美元’) -编号(“$1”)

如果我用
'135'
或任何其他数字替换
'1'
,效果会很好

  @w3c:     true;   // valid w3c syntax

  @webkit:  true;   // Google Chrome, Safari, iOS
  @moz:     true;   // Mozilla Firefox
  @ms:      true;   // Internet Explorer
  @o:       true;   // Opera

  @default-background-image: linear-gradient(135deg, blue, red), linear-gradient(150deg, green, orange);

.background-image (@arguments: @default-background-image;) {
  .result (...) when (@webkit = true) {
    background-image: ~`"@{arguments}"
      .replace(/[\[\]]/g,'')
      .replace("linear-gradient","-webkit-linear-gradient")
      .replace(/(\d*)?deg/g, 90 - '$1' + 'deg')`;
  }

  .result (...) when (@moz = true) {
    background-image: ~`"@{arguments}"
      .replace(/[\[\]]/g,'')
      .replace("linear-gradient","-moz-linear-gradient")
      .replace(/(\d*)?deg/g, 90 - '$1' + 'deg')`;
  }

  .result (...) when (@ms = true) {
    background-image: ~`"@{arguments}"
      .replace(/[\[\]]/g,'')
      .replace("linear-gradient","-ms-linear-gradient")
      .replace(/(\d*)?deg/g, 90 - '$1' + 'deg')`;
  }

  .result (...) when (@o = true) {
    background-image: ~`"@{arguments}"
      .replace(/[\[\]]/g,'')
      .replace("linear-gradient","-o-linear-gradient")
      .replace(/(\d*)?deg/g, 90 - '$1' + 'deg')`;
  }

  .result (...) when (@w3c = true) {
    background-image: @arguments;
  }

  .result (@arguments);
}

如果使用

.replace(/(\d+)(=deg)/g,90-parseInt($1))
其中未引用
$1

java脚本似乎将引用的$1解释为“不是数字”的字符串

我还将表达式转换为使用非捕获前瞻,这将消除在替换中重新插入
deg
的需要

另一个问题是您的正则表达式正在匹配
\d*?deg
,它是字符串
deg
之前的零个或多个数字。我已将
\d*?
替换为
\d+
,以匹配一个或多个数字。

您需要一个替换函数,而不是一个表达式(作为字符串进行计算,导致问题):

我删除了
,因为
\d*
已经满足了这一要求。另外,我会使用
\d+
,因为空数字没有意义

示例

var str = '@default-background-image: linear-gradient(135deg, blue, red), linear-gradient(150deg, green, orange);';

str.replace(/(\d*)deg/g, function($0, $1) {
    return (90 - parseInt($1)) + 'deg';
});
输出:

"@default-background-image: linear-gradient(-45deg, blue, red), linear-gradient(-60deg, green, orange);"

$1没有定义,因为我使用了那些正则表达式子字符串。但是你的回答帮助我理解了整个要点。我在这里提到过你:@user2425777非常感谢;-)顺便说一句,如果你打算重用这个转换函数,你可以定义它一次并多次引用它来节省一些内存。我会考虑一下,尽管它现在的优先级很低,因为它应该只在开发环境中使用,或者编译成css。顺便说一句,我注意到,GitHub对您的信任是相当隐蔽和临时的,因此:这也将在文档中使用。
"@default-background-image: linear-gradient(-45deg, blue, red), linear-gradient(-60deg, green, orange);"