Как разделить фразу на новую строку каждые x символов в Google Sheets?

Я перевожу игру, и текстовое поле игры поддерживает не более 50 символов в каждой строке. Есть ли способ использовать формулу для разбиения всего предложения каждые 50 символов или целого слова (49, 48, 47 и т. Д.)?

В настоящее время я работаю с этой формулой.

=JOIN(CHAR(10),SPLIT(REGEXREPLACE(A1, "(.{50})", "/$1"),"/"))

Проблема с этим кодом состоит в том, что он разделяется ровно на 50 символов (один раз) и будет разбиваться в середине слова.

Опять же, моя цель - не разбивать его на 50-й символ, если 50-й символ находится в середине слова, и чтобы правило применялось и к остальным строкам, потому что оно применяется только к первой строке.

Пожалуйста, посмотрите на этот тестовый лист Google, чтобы получить пример того, о чем я говорю.

Если это невозможно сделать в Google Sheets, я не возражаю переходить в Excel, если у меня есть работающий код.

Для справки, я спрашивал на форумах по продуктам Google 2 дня назад и до сих пор не получил ответа.

3 ответа

=REGEXREPLACE(A1, "(.{1,50})\b", "$1" & CHAR(10))

{50} соответствует ровно 50 раз, но вам нужно 50 или меньше.

\b является границей слова, которая соответствует буквенно-цифровому и не буквенно-цифровому символу.

Вы довольно близко Я не эксперт в Sheets, поэтому не уверен, что это лучший способ, но ваш Regex не подходит для того, что вы хотите.

Кроме того, вы должны быть уверены, что вы не используете разделенный символ, который может появиться в самой фразе. Однако, используя CHAR(10) для замены символа позволяет вставить LF не пройдя через JOIN SPLIT последовательность.

  1. заменить любые переводы строки, возврат каретки и пробелы одним пробелом
  2. Сопоставьте строки, которые начинаются с непробельного символа, за которым следует до 49 символов, за которыми следует пробел или конец строки.
  3. заменить группу захвата группой захвата, за которой следует CHAR(10) (и удалите пробел после).

  4. Там будет дополнительный CHAR(10) в конце, который вы можете снять.

РЕДАКТИРОВАТЬ Регулярное выражение немного изменилось из-за различий в поведении между RE и тем, к чему я привык (вероятно, связано с тем, как работает регулярное выражение без возврата). Проблема появилась на вашем примере:

=regexreplace(REGEXREPLACE(REGEXREPLACE(A1 & " ","[\r\n\s]+"," "),"(\S.{0,49})\s","$1" & char(10)),"\n+\z","")
  = REGEXEXTRACT(A1,"(?ism)^"&REPT("([\w\d'\(\),. ]{0,49}\s)", ROUNDUP(LEN(A1)/50,0))&"([\w\d'\(\),. ]{0,49})$")

Протестировано с различными выражениями и работает как задумано. Обратите внимание, что разрешены только эти символы [a-zA-Z0-9_'(),.], что означает - и другие не упомянутые символы не будут работать. Если они вам нужны, добавьте их в выражение REPT и завершите формулу регулярного выражения. В противном случае, это будет работать отлично.

Другие вопросы по тегам