В JavaScript, как разделить строку «aa, bb \\, cc, dd» запятой, но только если предыдущий символ не имеет обратной косой черты? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть строка aa,bb\\,cc,dd. Мне нужно разделить его запятой, но только если предыдущий символ не имеет обратной косой черты. Итак, что я хочу, это:

aa
bb\\,cc
dd

Поскольку регулярное выражение JavaScript не поддерживает отрицательный взгляд назад, я хочу знать, как его решить в этом случае. Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Если вы хотите разделить запятую с помощью утверждения с задним взглядом, вы можете разделить все запятые, а затем принудительно применить утверждение с указанием в виде .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)
0 голосов
/ 10 сентября 2018

Вы можете использовать это регулярное выражение для 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]
...