javascript - 正则表达式:按字符拆分字符串,除非在引号或双引号内
问题描述
我需要使用分隔符(在我的示例中为 =)来拆分字符串,除非此字符在引号或双引号内
我成功地在单引号内使用\=+(?=(?:(?:[^']*'){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);
解决方案
lookahead 和lookbehind 不消耗字符,因此您可以一起使用多个。您可以使用
\=+(?=(?:(?:[^"]*"){2})*[^"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:(?:[^`]*`){2})*[^`]*$)