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);"