首页 > 解决方案 > 如何使用正则表达式从数据中检索数字?

问题描述

我正在尝试在字母之后和美元符号之前检索数字。当我运行我的代码时,我一直收到“null”作为输出。

例如:数字 2.1315、1.94733、1.07511 来自 VOO 2.1315 $262.67$86.88$559.88DIS 1.94733 $104.45$27.77$203.40IWM 1.07511 $122.55...

var data = "VOO2.1315$262.67$86.88$559.88DIS1.94733$104.45$27.77$203.40IWM1.07511$122.55$14.98$131.75DAL5$24.04-$44.26$120.19XOM2$42.46-$18.40$84.92VYM1$77.59$7.15$77.59SBUX1.19403$76.64$15.12$91.51"; 
var regex = /^\d+\.\d{0,2}$/g;
var found = data.match(regex);
console.log(found);
console.log(data);

标签: javascriptregexstringsortingnumbers

解决方案


我从数字中的字符串进行转换,如果您不需要,则删除.map(Number)

Lookbehind 断言它在 ECMA-262 规范中可用

const data = 'VOO2.1315$262.67$86.88$559.88DIS1.94733$104.45$27.77$203.40IWM1.07511$122.55$14.98$131.75DAL5$24.04-$44.26$120.19XOM2$42.46-$18.40$84.92VYM1$77.59$7.15$77.59SBUX1.19403$76.64$15.12$91.51';
const regex = /(?<=[a-z])\d+\.\d+(?=\$)/gi;

const numbers = data
  .match(regex)
  .map(Number);

console.log(numbers);

较旧的浏览器不支持 JavaScript 正则表达式中的lookbehind。你必须使用两个正则表达式

const data = 'VOO2.1315$262.67$86.88$559.88DIS1.94733$104.45$27.77$203.40IWM1.07511$122.55$14.98$131.75DAL5$24.04-$44.26$120.19XOM2$42.46-$18.40$84.92VYM1$77.59$7.15$77.59SBUX1.19403$76.64$15.12$91.51';
const regex = /[a-z](\d+\.\d+)\$/gi;

const numbers = data
  .match(regex)
  .map(item => item.match(/\d+\.\d+/))
  //  or you can use slice instead of regex
  // .map(item => item.slice(1, -1))
  .map(Number);

console.log(numbers);

输出:

Array(25) [ 2.1315, 1.94733, 1.07511 1.19403 ]

推荐阅读