Как заменить одну запятую вне скобок

1

У меня есть текст, например:

Я хотел бы съесть пирог, я хотел бы вытащить собаку, я бы хотел поплавать (пирог, собака, плавать)

Мне нужен 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)
Теги:

2 ответа

5
Лучший ответ

Вы можете использовать регулярное выражение с негативным представлением (при условии, что скобки сбалансированы и не привязаны):

str = str.replace(/,\s*(?![^()]*\))/g, '\n');

Демо-версия RegEx

(?![^()]*\)) является отрицательным взглядом, чтобы утверждать, что мы не имеем а ) характера вперед без каких-либо ( или ) символов между ними.

Код:

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
    Смелое предположение.
  • 1
    Вы прибили это, Отлично
Показать ещё 1 комментарий
2

Сопоставьте (...) подстроки и совпадение и захват , в других контекстах, чтобы позже заменить новой строкой после проверки соответствия группы 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню