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

标签 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 公里/小时 -> [ '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/

相关文章:

regex - 了解 RewriteCond 中的 THE_REQUEST 变量

javascript - 运行基本 Express 项目时出错

node.js - Mongo .get 返回垃圾

php - 将文本写入图像

javascript - 如何从匿名函数中删除函数的属性?

正则表达式匹配ababba等字符串

node.js - 将视频转换为 mp3 node.js

javascript - 自定义模块的相对与非相对模块导入

Javascript 回调函数错误

JavaScript 正则表达式 - 只接受两个没有特殊字符的单词