Как вставить тег каждые 5 символов в Ruby String?

Я хотел бы вставить тег <wbr> каждые 5 символов.

Вход: s = 'HelloWorld-Hello guys'

Ожидаемый результат: Hello<wbr>World<wbr>-Hell<wbr>o guys

Ответ 1

s = 'HelloWorld-Hello guys'
s.scan(/.{5}|.+/).join("<wbr>")

Пояснение:

Scan группирует все совпадения регулярного выражения в массив. .{5} соответствует любым 5 символам. Если в конце строки остались символы, они будут сопоставляться с .+. Присоедините массив к вашей строке

Ответ 2

Есть несколько вариантов для этого. Если вы просто хотите вставить строку разделителя, вы можете использовать scan, а затем join следующим образом:

s = '12345678901234567'
puts s.scan(/.{1,5}/).join(":")
# 12345:67890:12345:67

.{1,5} соответствует от 1 до 5 символов "любого", но поскольку он жадный, для него потребуется 5, если возможно. Пособие для принятия меньше - это размещение последнего матча, где может не хватить остатков.

Другой вариант - использовать gsub, что позволяет использовать более гибкие подстановки:

puts s.gsub(/.{1,5}/, '<\0>')
# <12345><67890><12345><67>

\0 является обратной ссылкой на то, что соответствует группе 0, т.е. всему совпадению. Таким образом, подставляя <\0>, эффективно помещает любое регулярное выражение, сопоставляемое в литеральных скобках.

Если пробелы не подсчитываются, вместо . вы хотите сопоставить \s*\S (т.е. не пустое пространство, возможно, которому предшествуют пробелы).

s = '123 4 567  890   1 2 3 456 7  '
puts s.gsub(/(\s*\S){1,5}/, '[\0]')
# [123 4 5][67  890][   1 2 3 45][6 7]  

Приложения

Ссылки

Ответ 3

Вот решение, которое адаптировано из в недавнем вопросе:

class String
  def in_groups_of(n, sep = ' ')
    chars.each_slice(n).map(&:join).join(sep)
  end
end

p 'HelloWorld-Hello guys'.in_groups_of(5,'<wbr>')
# "Hello<wbr>World<wbr>-Hell<wbr>o guy<wbr>s"

Результат отличается от вашего примера тем, что пространство считается символом, оставляя окончательный s в своей группе. Был ли ваш пример испорчен или вы хотите исключить пробелы (пробелы в целом?) Из числа символов?


Только считать не-пробелы ( "приклеивание" завершающего пробела до последнего не-пробела, оставив только строки только для пробелов):

# count "hard coded" into regexp
s.scan(/(?:\s*\S(?:\s+\z)?){1,5}|\s+\z/).join('<wbr>')

# parametric count
s.scan(/\s*\S(?:\s+\z)?|\s+\z/).each_slice(5).map(&:join).join('<wbr>')