我正在尝试创建一个组来保存下面多行列表中的数字。 正则表达式似乎在这里工作 - https://regex101.com/r/tS5qV5/1但是当我用 nodejs 运行它时,它没有给我正确的输出。有什么想法可能是错误的吗?
正则表达式
/(\d{1,3}(?:\.\d{1,2}){0,1})?(km\/h|m\/h)?(?:(?:audi|bmw)(?:\scoupe)*)*/gmi
文字
2.33 km/h
km/h 2.33
结果
2.33 公里/小时
-> [ '2.33', '', '公里/小时', '' ]
公里/小时 2.33
-> [ '公里/小时', '', '2.33', '' ]
两条线路均预期
['2.33','公里/小时']
Node 代码
var match = req.match(/(\d{1,3}(?:\.\d{1,2}){0,1})?(km\/h|m\/h)?(?:(?:audi|bmw)(?:\scoupe)*)*/gmi);
console.log(match);
最佳答案
您需要的是 JS 正则表达式引擎不支持的分支重置功能。</p>
您只能在常规分组构造中使用捕获,然后添加一些 JS 逻辑以使结果数组包含您需要的值:
/(?:(\d{1,3}(?:\.\d{1,2})?)\s*(k?m\/h)|(k?m\/h)\s*(\d{1,3}(?:\.\d{1,2})?))?(?:(?:audi|bmw)(?:\scoupe)*)*/gi
参见the regex demo ,下面是帮助您构建正确结果的代码:
var re = /(?:(\d{1,3}(?:\.\d{1,2})?)\s*(k?m\/h)|(k?m\/h)\s*(\d{1,3}(?:\.\d{1,2})?))?(?:(?:audi|bmw)(?:\scoupe)*)*/gi;
function testResults(str) {
var res = [];
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
if (m[1]) {
res.push(m[1], m[2]); //First goes Group 1, then Group 2
} else if (m[3]) {
res.push(m[4], m[3]); // Swapping to ensure the same order
} else if (m[0]) {
res.push(m[0]);
}
}
return res;
}
var s = '2.33 km/h audi bmw coupe coupe';
document.body.innerHTML = "<pre>" + s + "<br/>" + JSON.stringify(testResults(s), 0, 4) + "</pre>";
s = 'km/h 2.33';
document.body.innerHTML += "<pre>" + s + "<br/>" + JSON.stringify(testResults(s), 0, 4) + "</pre>";
// Results:
// '2.33 km/h audi bmw coupe coupe' => ["2.33","km/h", "audi", "bmw coupe coupe"]
// 'km/h 2.33' => ["2.33","km/h"]
关于javascript - 将数字始终保留在第一组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382593/