首页 > 解决方案 > 正则表达式:按字符拆分字符串,除非在引号或双引号内

问题描述

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

我成功地在单引号内使用\=+(?=(?:(?:[^']*'){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);

标签: javascriptregexstringquotesdouble-quotes

解决方案


lookahead 和lookbehind 不消耗字符,因此您可以一起使用多个。您可以使用

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

正则表达式演示


推荐阅读