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

LESS / javascript: convert regexp object to integer (calculation)

本文关键字:整数 计算 转换 对象 javascript regexp LESS      更新时间:2023-09-26

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

重要的部分是.replace(/('d*)?deg/g, 90 - '$1' + 'deg'),我尝试了不同的功能,但无论如何,输出总是以NaN结束:方法(1美元)parseFloat(1美元)- eval(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);
}

您需要替换函数而不是表达式(它被计算为字符串,导致问题):

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

我已经删除了?,因为'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);"

如果使用

.replace(/('d+)(?=deg)/g, 90 - parseInt($1)) where $1 not引号?

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

我还将表达式转换为使用非捕获前向查找,这将消除插入重新插入deg的需要。

另一个问题是,您的regex匹配'd*?deg,这是字符串deg之前的零或多个数字,我用'd+取代了'd*?以匹配1个或多个数字。