我正在寻找一种从字符串中提取Numbers/Numbers的方法。示例:
const string = "Monthly Weather Review, Volume 129, Issues 9-12"
我在这个网站上找到了一个解决方案。问题是我不是很理解它。有人能解释一下下面这行到底发生了什么吗?
let res = string.match(/[+-]?d+(?:.d+)?/g).map(Number); //return [129, 9, -12]
正则表达式:
[+-]?d+(?:.d+)?
将匹配以下子字符串:
[+-]?
-可以以+
或-
开头(字符集,由以下?
设置为可选(d+
-然后,包含一个或多个数字字符(0到9之间的数字((?:.d+)?
-非捕获组,由?
设置为可选组:.d+
-可以匹配文字.
,后面跟更多数字字符
模式中唯一没有被输入使用的部分是末尾的小数部分。例如,在字符串中
foo +12.34
它将匹配CCD_ 10。
正则表达式匹配将较大字符串中的子字符串提取为数组。.map(Number)
使用Array.prototype.map
将一个数组的所有元素转换为另一个数组——它将字符串数组转换为数字数组。
对于初学者来说,.match(regex)
是String
原型上的一个方法,它给定了一个正则表达式,将执行它并在没有任何匹配的情况下返回结果或null
。有关详细信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
对于正则表达式,/[+-]?d+(?:.d+)?/g
:
[+-]?
可选择匹配+或-d+
匹配一个或多个数字(?:.d+)?
非捕获组的.
后面跟数字(您在这里得到的是十进制值(。这对于?
是可选的。看起来他们这里只想要整数/g
-g
用于全局。所有比赛都回来了
有关正则表达式的详细信息:https://www.rexegg.com/regex-quickstart.html
.map(Number)
将迭代matches数组中的每个字符串项(所有匹配都是字符串,因为这是第一件事(,并使用Number()
函数强制为数字。
有关Number
的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
有关.map
的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map