У меня есть текст, например:
Я хотел бы съесть пирог, я хотел бы вытащить собаку, я бы хотел поплавать (пирог, собака, плавать)
Мне нужен JavaScript RegEx, которая заменяет ,
с новой линией вне ()
Прямо сейчас, если я использую .replace(/,/g, "\n")
я получаю:
I would like to eat a pie
I would like to take the dog out
I would like to swim(pie
dog
out)
Что мне нужно:
I would like to eat a pie
I would like to take the dog out
I would like to swim(pie,dog,swim)
Вы можете использовать регулярное выражение с негативным представлением (при условии, что скобки сбалансированы и не привязаны):
str = str.replace(/,\s*(?![^()]*\))/g, '\n');
(?![^()]*\))
является отрицательным взглядом, чтобы утверждать, что мы не имеем а )
характера вперед без каких-либо (
или )
символов между ними.
Код:
var str = 'I would like to eat a pie,I would like to take the dog out, I would like to swim(pie,dog,swim)';
console.log(str.replace(/,\s*(?![^()]*\))/g, '\n'));
Сопоставьте (...)
подстроки и совпадение и захват ,
в других контекстах, чтобы позже заменить новой строкой после проверки соответствия группы 1:
var rx = /\([^)]*\)|(,)\s*/g;
var s = "I would like to eat a pie,I would like to take the dog out, I would like to swim(pie,dog,swim)";
var result = s.replace(rx, function($0,$1) {
return $1 ? "\n" : $1;
});
console.log(result);
Шаблон соответствует:
\(
- a (
[^)]*
- 0+ символы кроме )
\)
- а )
|
- или же(,)
- Группа 1: a ,
char\s*
- 0+ пробелы (чтобы "обрезать" пробелы перед линией).См. Демо-версию regex.