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

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

提问人:Nicolas Vuillamy 提问时间:7/17/2020 最后编辑:Nicolas Vuillamy 更新时间:7/17/2020 访问量:456

问:

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

我成功地在单引号内使用 ,或在双引号内使用 ,但不能同时使用,什么是合适的正则表达式?\=+(?=(?:(?:[^']*'){2})*[^']*$)\=+(?=(?:(?:[^"]*"){2})*[^"]*$)

奖励:如果当角色不在角色内部时也可以拆分,那将是完美的:)

enter image description here

enter image description here

我需要什么:

enter image description here

编辑:要重现的 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);
JavaScript 正则表达式 字符串 双引号

评论

0赞 Mohsen Alyafei 7/17/2020
为什么不尝试另一种方法来拆分字符串。
0赞 Nicolas Vuillamy 7/17/2020
如果你有一个,我全都听:)
1赞 Sysix 7/17/2020
你能把你的测试字符串作为代码发布吗?
0赞 A. Pond 7/17/2020
这是一个非常困难的问题,没有简单的答案。在此处查看更多讨论
0赞 Nicolas Vuillamy 7/17/2020
我将测试字符串添加为代码

答:

1赞 mjrezaee 7/17/2020 #1

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

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

正则表达式演示

评论

0赞 Mohsen Alyafei 7/17/2020
当引号不匹配时,这将失败,如下所示:'inside = ' and another = '...
0赞 kmaork 7/17/2020 #2

下面的正则表达式查找不在 '、“ 或 ' 对中的字符。=

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

示例的行为enter image description here

评论

0赞 Nicolas Vuillamy 7/17/2020
不工作 :/imgur.com/a/MLNGfwc
0赞 kmaork 7/17/2020
很奇怪,我使用的是同一个网站,它对我有用......
0赞 kmaork 7/17/2020
你使用的是 javascript 语法吗?
0赞 Nicolas Vuillamy 7/17/2020
您可以保存 Regex101 并发布链接吗?