正则表达式:按字符拆分字符串,除非在引号或双引号内

Regex: split string by character except if inside quotes or double quotes

我需要使用分隔符(在我的示例中为 =)拆分字符串,除非该字符在引号或双引号内

我使用 \=+(?=(?:(?:[^']*'){2})*[^']*$) 在单引号内成功完成,或使用 \=+(?=(?:(?:[^"]*"){2})*[^"]*$) 在双引号内成功完成,但不是两者都成功,合适的 RegExp 是什么?

奖金:如果当字符不在字符 ` 内时它也可以拆分,那就完美了:)

我需要什么:

编辑: Javascript 重现示例 ( https://jsfiddle.net/cgnorhm0/ )

function splitByCharExceptInsideString(str, delimiterChar) {
    // split line by character except when it is inside quotes
    const escapedChar = delimiterChar.replace(/[-[\]{}()*+!<=:?./\^$|#\s,]/g, "\$&");
    const regSplit = new RegExp(escapedChar + `+(?=(?:(?:[^']*'){2})*[^']*$)`);
    const splits = str.split(regSplit);
    return splits ;
}

const testStr = `image.inside {
    sshagent(credentials: ['ssh-creds']) {
        env.GIT_SSH_COMMAND="ssh -T -o StrictHostKeyChecking=no"
        env.GIT_SSH_COMMAND2='ssh -T -o StrictHostKeyChecking=no'
    }
}`;
const delimiterChar = '=';

const splitLs = splitByCharExceptInsideString(testStr,delimiterChar);
console.log(splitLs);

前瞻和后视不消耗字符,因此您可以同时使用多个。你可以使用

\=+(?=(?:(?:[^"]*"){2})*[^"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:(?:[^`]*`){2})*[^`]*$)

Regex Demo

下面的正则表达式找到 = 个不在 `、" 或 ' 对内的字符。

const regex = /=(?=.*)(?=(?:'.*?'|".*?"|`.*?`).*?)/;

Behavior with your example: