我试图通过删除那些重复代码来使我的代码看起来更专业。问题是我想从字符串中获取一些数据,具体来说,我需要知道 NUMBER
, X
, Y
, Z
, A
, B
等值,但是正则表达式对于每个变量都是不同的,所以我不得不重复自己写很多重复的代码.
let TextString = `DRILL(NUMBER:=20,NAME:='4',PN:=1,X:=10.1,Y:=73.344,Z:=0,A:=-1.435,B:=1.045,M1:=1,M2:=2,M3:=3,M4:=4,M5:=1,S1:=10.5,S2:=2.1,S3:=1.2,S4:=2,S5:=2.4,RS1:=1,RS2:=2);`;
const regNumber = /(?<=NUMBER:=)[0-9]+/gm;
let lineNumber = Number(TextString.match(regNumber));
const regX = /(?<=X:=)(-?[0-9]+)(.[0-9]+)?/gm;
let X = Number(TextString.match(regX)).toFixed(1);
const regY = /(?<=Y:=)(-?[0-9]+)(.[0-9]+)?/gm;
let Y = Number(TextString.match(regY)).toFixed(1);
const regZ = /(?<=Z:=)(-?[0-9]+)(.[0-9]+)?/gm;
let Z = Number(TextString.match(regZ)).toFixed(1);
const regA = /(?<=A:=)(-?[0-9]+)(.[0-9]+)?/gm;
let A = Number(TextString.match(regA)).toFixed(1);
const regB = /(?<=B:=)(-?[0-9]+)(.[0-9]+)?/gm;
let B = Number(TextString.match(regB)).toFixed(1);
// and many more duplicate code.
console.log(lineNumber, X, Y, Z, A, B);
我只能想到像上面这样的方法,分别匹配每个变量并运行 .match()
多次,但正如您所看到的,总共有 17 个变量,在实际情况下,这些 TextString
有数百个。我担心这个匹配过程会对性能产生巨大影响。
是否有任何其他方法可以在一次匹配中获取所有变量并将它们存储在数组或对象中?或者任何其他优雅的方式来做到这一点?
最佳答案
每个坐标都有一个字母标识符,因此您可以使用更通用的正向回顾 (?<=,[A-Z]:=)
.此回溯匹配一个逗号后跟一个大写字母然后是等号。
然后您可以使用 .match()
获取所有匹配项并使用 .map()
运行您正在执行的转换。
let TextString = `DRILL(NUMBER:=20,NAME:='4',PN:=1,X:=10.1,Y:=73.344,Z:=0,A:=-1.435,B:=1.045,M1:=1,M2:=2,M3:=3,M4:=4,M5:=1,S1:=10.5,S2:=2.1,S3:=1.2,S4:=2,S5:=2.4,RS1:=1,RS2:=2);`;
const regNumber = /(?<=NUMBER:=)[0-9]+/gm;
let lineNumber = Number(TextString.match(regNumber));
const regex = /(?<=,[A-Z]:=)(-?[0-9]+)(.[0-9]+)?/gm;
let coord = TextString.match(regex).map(n => Number(n).toFixed(1));
console.log(lineNumber, coord);
关于javascript - 通过 Javascript 在一次匹配中获取多个正则表达式匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74895827/