我试图创建一个包含下面多行列表中的数字的组。 正则表达式似乎在这里工作 - 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 km/h
- > [ '2.33', '', 'km/h', '' ]
km/h 2.33
- > [ 'km/h', '', '2.33', '' ]
预计两行
[ '2.33', 'km/h']
节点代码
var match = req.match(/(\d{1,3}(?:\.\d{1,2}){0,1})?(km\/h|m\/h)?(?:(?:audi|bmw)(?:\scoupe)*)*/gmi);
console.log(match);
答案 0 :(得分:1)
您需要的是JS正则表达式引擎不支持的分支重置功能。</ p>
您只能在常规分组构造中使用捕获,然后添加一些JS逻辑以使结果数组包含您需要的值: 请参阅the regex demo,以下是帮助您构建正确结果的代码: /(?:(\d{1,3}(?:\.\d{1,2})?)\s*(k?m\/h)|(k?m\/h)\s*(\d{1,3}(?:\.\d{1,2})?))?(?:(?:audi|bmw)(?:\scoupe)*)*/gi
&#13;
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"]