【发布时间】:2018-09-10 15:10:27
【问题描述】:
我有一个字符串aa,bb\\,cc,dd。我需要用逗号分隔它,但前提是前一个字符不是反斜杠。所以我想要的是:
aa
bb\\,cc
dd
由于 JavaScript 正则表达式不支持负回溯,我想知道在这种情况下如何解决它。谢谢你。
【问题讨论】:
标签: javascript regex string split regex-lookarounds
我有一个字符串aa,bb\\,cc,dd。我需要用逗号分隔它,但前提是前一个字符不是反斜杠。所以我想要的是:
aa
bb\\,cc
dd
由于 JavaScript 正则表达式不支持负回溯,我想知道在这种情况下如何解决它。谢谢你。
【问题讨论】:
标签: javascript regex string split regex-lookarounds
您可以将此正则表达式用于match:
/(?=.)([^,\\]*(?:\\.[^,\\]*)*)(?:,|$)/gm
此正则表达式在匹配在下一个位置具有逗号或行尾的子字符串时忽略所有转义字符。
正则表达式详细信息:
(?=.): 确保我们不匹配空字符串([^,\\]*:匹配 0 个或多个不是 , 和 \ 的字符
(?:\\.[^,\\]*)*):匹配\,后跟转义字符,然后是0个或多个不是,和\的字符。(?:,|$):匹配逗号或行尾const regex = /(?=.)([^,\\]*(?:\\.[^,\\]*)*)(?:,|$)/gm;
const str = `aa,bb\\,cc,dd`;
let m;
while ((m = regex.exec(str)) !== null) {
console.log(m[1]);
}
//=> [aa, bb\,cc, dd]
【讨论】:
如果您想使用后向断言按逗号分割,您可以按所有逗号分割,然后在累加数组时在 .reduce() 中强制执行后向断言。
const str = 'aa,bb\\,cc,dd'
const values = str.split(/,/g).reduce((acc, str) => {
const lastIndex = acc.length - 1
if (lastIndex >= 0 && acc[lastIndex].endsWith('\\')) {
acc[lastIndex] += str
} else {
acc.push(str)
}
return acc
}, [])
console.log(values)
【讨论】: