Сделайте регулярное выражение, которое заменяет разделенный запятыми список (например, «один, два, три») на «один, два и три», если элементы 3+, или «один и два», если элементы 2 - PullRequest
0 голосов
/ 03 марта 2019

Проблема:

Я пытаюсь создать регулярное выражение ( в Google Sheets ), которое преобразует разделенный запятыми список в стандартный формат для чтения на английском языке.

Примеры ввода / вывода:

Если список содержит 3+ элемента, например one,two,three, он должен вернуть one, two, and three, а если список содержит 2 элемента, напримеркак one,two, тогда он должен вернуть and and two, а если список содержит только 1 элемент, такой как one, то он должен вернуть one

Мой подход JavaScript:

Вот как я (возможно, неэффективно) достиг того же с помощью одномерного массива в JavaScript:

function joinWith(arr, sep, lastsep){ // e.g. joinWith(listOfNames, ",", "and")
  sep += ' ', lastsep = ' ' + lastsep + ' ';
  var rtn = [arr.slice(0, -1).join(sep) + (arr.length > 2 ? sep : ''), arr.slice(-1)[0]].join(arr.length < 2 ? '' : lastsep);
  return rtn;
}

Другими словами:

Вот чтоЯ думаю, что я хочу сделать (если, конечно, я что-то упускаю):

  1. Удалите все окружающие запятые отступы.
  2. Добавьте пробел после каждой запятой.
  3. Перед последним элементом добавьте «и».

Вот что я пробовал использовать REGEXREPLACE

=REGEXREPLACE(A1, ",\s*([^,]+)$", ", and $1")

Это настолько близко, насколько я получил к желаемому результату, но когда в списке есть 2 элемента, он вставляет запятую, и я не хочу, чтобыпроизойдет, если в списке не будет 3 или более элементов.

Here's a screenshot of my test case.

Избыточный неэксплуатационный метод

И затемЯ использовал подход с избыточным количеством, но я бы предпочел что-то более элегантное в одном регулярном выражении:

=REGEXREPLACE(A1, ",\s*([^,]+)$", IF(COLUMNS(SPLIT(A1, ",")) > 2, ",", "") & " and $1")

And here's the screenshot of that approach.

1 Ответ

0 голосов
/ 06 марта 2019

Одно из знаков препинания заключается в том, что в списке нет запятой до "and".т.е. "item1, item2 and item3" - это правильный способ форматирования списка.Если читатели хотят этого, то не делают последний шаг.Этот код также не использует обходные пути, потому что они не поддерживаются Google Sheets.

Есть три операций, которые вы пытаетесь выполнить как one ...просто используйте отдельные операции.

Операции:

  1. правильно отформатируйте запятые и пробелы
  2. замените последнюю запятую на "и"
  3. ставьте запятую перед "и «если есть более 2 терминов

Используйте вложенные вызовы для REGEXREPLACE, один вызов для каждой операции:

=REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(A1, "\s*, \s*", ", "), ", ([^,]+)$", ", and $1"), "^([^,]+), and ([^,]+)$", "$1 and $2")

Если вы всегда хотите запятую перед« и”, Не выполняйте самые внешние операции.

Отказ от ответственности: этот ответ был получен с моего телефона, поэтому он может работать некорректно или даже компилироваться, но есть большая вероятность, что он будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...