Проблема:
Я пытаюсь создать регулярное выражение ( в 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;
}
Другими словами:
Вот чтоЯ думаю, что я хочу сделать (если, конечно, я что-то упускаю):
- Удалите все окружающие запятые отступы.
- Добавьте пробел после каждой запятой.
- Перед последним элементом добавьте «и».
Вот что я пробовал использовать REGEXREPLACE
=REGEXREPLACE(A1, ",\s*([^,]+)$", ", and $1")
Это настолько близко, насколько я получил к желаемому результату, но когда в списке есть 2 элемента, он вставляет запятую, и я не хочу, чтобыпроизойдет, если в списке не будет 3 или более элементов.

Избыточный неэксплуатационный метод
И затемЯ использовал подход с избыточным количеством, но я бы предпочел что-то более элегантное в одном регулярном выражении:
=REGEXREPLACE(A1, ",\s*([^,]+)$", IF(COLUMNS(SPLIT(A1, ",")) > 2, ",", "") & " and $1")
