考虑一下javascript中的以下字符串:

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


评论


\ $ \ 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



#2 楼

代码在以下情况下将失败:


负数
十进制数
px以外的单位(例如pt%vwvh,...)

此外,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上正则表达式的在线演示。