Как рассплитить строку по двум условиям с помощью регулярного выражения?
Мне нужно сплитить строку по пробелу или запятой. Вот как я это делаю:
string.split(/(?:,|\s)+/)
Как сделать так, чтобы строка не сплитилась по пробелу, если он находится в подстроке, которая внутри квадратных скобок?
Ответы (1 шт):
Во-первых, ваше регулярное выражение лучше записать в виде символьного класса, /[\s,]+/, так оно будет работать быстрее.
Чтобы строка не разбивалась пробелами и запятыми внутри квадратных скобок, можно использовать
console.log("[abc def, ghi] jkl mno, prst".split(/[\s,]+(?![^\][]*])/));
console.log("[abc def, ghi] jkl mno, prst".match(/\[[^\][]*]|[^\s,]+/g));
См. пример работы регулярного выражения №1 и пример работы регулярного выражения №2.
Для большей точности работы первого выражения добавьте блок предварительного просмотра назад, /(?<!\[[^\][]*)[\s,]+(?![^\][]*])/ (см. пример).
Описание шаблонов
(?<!\[[^\][]*)- отицательный блок предварительного просмотра назад, который отменяет совпадение, если сразу перед текущей позицией есть символ[, за которым следует 0 и более символов, отличных от[и][\s,]+- один и более пробельных символов или/и запятых(?![^\][]*])- отицательный блок предварительного просмотра вперёд, который отменяет совпадение, если сразу после текущей позиции есть 0 и более символов, отличных от[и], а потом]
Второе регулярное выражение (используемое в String#match):
\[[^\][]*]-[, затем 0 и более символов, отличных от[и], а затем]|- или[^\s,]+- один и более символов, отличных от пробельных символов и запятых.