var string="border-radius:90px 20px 30px 40px";
我想从该字符串中提取4个数字并将它们存储在一个称为数字的数组中。为此,我开发了以下代码代码:
var numbers=string.split("border-radius:");
numbers=numbers[1].split("px");
此代码工作正常,但我想知道是否有更好的方法/解决方案。欢迎提出任何想法
#1 楼
我使用以下正则表达式从字符串中提取数字:var string = "border-radius:10px 20px 30px 40px";
var numbers = string.match(/\d+/g).map(Number);
#2 楼
代码在以下情况下将失败:负数
十进制数
px
以外的单位(例如pt
,%
,vw
,vh
,...) 此外,
numbers
数组在数字前包含空格,并在末尾包含一个空字符串,这是不需要的。来自字符串/[+-]?\d+(?:\.\d+)?/g
[+-]?
:数字前的可选+
或-
符号\d+
:匹配一个或多个数字(?:\.\d+)?
:可选的小数点。 ?:
表示非捕获组。g
标志:获取所有匹配项从字符串中提取数字后,它们可以转换为数字格式。
var regex = /[+-]?\d+(?:\.\d+)?/g;
var str = `padding: 0;
font-size: 16pt;
width: 50%;
height: 20vh;
margin-right: 12px;
padding-right: -12.5px;`;
var match;
while (match = regex.exec(str)) {
console.log(match[0]);
}
这里是Regex101上正则表达式的在线演示。
评论
\ $ \ begingroup \ $
这是一个更好,更强大的解决方案。我确信其他人可以帮助您改善正则表达式(不是我的优势,因此我不在这方面发表评论)。
\ $ \ endgroup \ $
–Jaxidian
16年1月5日在16:07
\ $ \ begingroup \ $
如果您希望数字是实际数字而不是字符串,则可以将其映射。最简单的版本是:string.match(/ \ d + / g).map(Number)
\ $ \ endgroup \ $
–行李员
16年5月5日在17:06
\ $ \ begingroup \ $
要处理负数(例如s ='translate(57px,-113px)'):var numbers = s.match(/-?\ d + / g).map(Number);
\ $ \ endgroup \ $
– Sean
18年1月15日在10:20
\ $ \ begingroup \ $
此方法省略了开头/前导零,例如“订单ID#00123”将导致提取123,但不会提取00123
\ $ \ endgroup \ $
– Clain Dsilva
19年6月5日14:15