始终将数字保留在第一组中

时间:2016-05-23 04:18:47

标签: javascript regex node.js

我试图创建一个包含下面多行列表中的数字的组。 正则表达式似乎在这里工作 - 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);

1 个答案:

答案 0 :(得分:1)

您需要的是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,以下是帮助您构建正确结果的代码:

&#13;
&#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"]
&#13;
&#13;
&#13;