JavaScript正则表达式,未获得所有匹配项,我在这里缺少什么?

时间:2018-12-16 15:09:38

标签: javascript regex

例如,我有这个简单的字符串

let str = '5+81+3+16+42'

现在,如果我想捕获带有两个数字的每个加号。

我的尝试如下:

let matches = str.match(/\d+\+\d+/g);

我得到的是:

['5+81', '3+16']

为什么情况不匹配?

['5+81', '81+3', '3+16', '16+42']

4 个答案:

答案 0 :(得分:3)

您的正则表达式必须满足\d+\+\d+的整个模式。它将首先匹配5+81,然后下一个字符是+,该模式无法匹配,因为它应该以数字开头。然后,它可以匹配3+16,但在您将+42作为匹配项的情况下,它不再匹配以下['5+81', '3+16']

如果没有正则表达式,则可以使用split和for循环,并检查parts数组中是否存在下一个值:

let str = '5+81+3+16+42'
let parts = str.split('+');
for (let i = 0; i < parts.length; i++) {
  if (undefined !== parts[i + 1]) {
    console.log(parts[i] + '+' + parts[i + 1]);
  }
}

在使用更多支持后向浏览器的最新版本的Chrome时,您可以将环顾四周功能用于捕获组:

(?<=(\d+))(\+)(?=(\d+))

请参见regex demo

const regex = /(?<=(\d+))(\+)(?=(\d+))/g;
const str = `5+81+3+16+42`;
let m;

while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log(m[1] + m[2] + m[3]);
}

答案 1 :(得分:2)

当正则表达式引擎完成一次匹配的迭代时,它将“使用”源字符串中的字符。 5+81的第一个匹配项在+之后的81符号处留下了下一个匹配项的起点,因此表达式的下一个匹配项从3开始。

答案 2 :(得分:2)

+分隔符分割字符串,然后使用.reduce()创建包含目标结果的新数组。

let str = '5+81+3+16+42';
let arr = str.split('+').reduce((tot, num, i, arr) => {	
  i+1 < arr.length ? tot.push(num+"+"+arr[i+1]) : '';
  return tot; 
}, []);
console.log(arr);

答案 3 :(得分:2)

您可以使用splitreduce进行操作,而不必使用正则表达式使事情复杂化。

upper=Value + 1.96*Std. Error