С учётом того, что глубина может меняться в любом порядке в середине выражения (к примеру: 0>1>2>3>2>3>4>3>2>3>4>3>2>1>0), то чисто регулярными выражениями данную задачу не решить (во всяком случае я не знаю способа вести подсчёт в них).
С использованием JS это решается довольно просто.
Как вариант:
const getLevel = (str, level) => {
const breckets = [...str.matchAll(/[()]/g)];
let currentLevel = 0;
let startLevelIndex = 0;
const results = [];
breckets.forEach((b) => {
if(b[0] === '(') {
currentLevel++;
if(currentLevel === level) {
startLevelIndex = b.index + 1;
}
return;
}
if(currentLevel === level) {
results.push(str.slice(startLevelIndex, b.index));
}
currentLevel--;
});
return results;
}
const testStr = '0 + (1 + 1 + (2 + (3 + 3 + (4 + 4) + 3) + 2 + (3 + (4 + 4 + 4) + (4 + (5 + 5) + 4) + 3) + 2) + 1) + 0 + (1 + 1)';
getLevel(testStr, 4);