【问题标题】:In JavaScript, how to split the string "aa,bb\\,cc,dd" by comma but only when the previous character is not backslash?在 JavaScript 中,如何用逗号分割字符串“aa,bb\\,cc,dd”,但前提是前一个字符不是反斜杠?
【发布时间】:2018-09-10 15:10:27
【问题描述】:

我有一个字符串aa,bb\\,cc,dd。我需要用逗号分隔它,但前提是前一个字符不是反斜杠。所以我想要的是:

aa
bb\\,cc
dd

由于 JavaScript 正则表达式不支持负回溯,我想知道在这种情况下如何解决它。谢谢你。

【问题讨论】:

标签: javascript regex string split regex-lookarounds


【解决方案1】:

您可以将此正则表达式用于match

/(?=.)([^,\\]*(?:\\.[^,\\]*)*)(?:,|$)/gm

此正则表达式在匹配在下一个位置具有逗号或行尾的子字符串时忽略所有转义字符。

RegEx Demo

正则表达式详细信息:

  • (?=.): 确保我们不匹配空字符串
  • ([^,\\]*:匹配 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]

【讨论】:

    【解决方案2】:

    如果您想使用后向断言按逗号分割,您可以按所有逗号分割,然后在累加数组时在 .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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多