例如,我有这个简单的字符串
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']
答案 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)