Я хотел бы вставить тег <wbr>
каждые 5 символов.
Вход: s = 'HelloWorld-Hello guys'
Ожидаемый результат: Hello<wbr>World<wbr>-Hell<wbr>o guys
Я хотел бы вставить тег <wbr>
каждые 5 символов.
Вход: s = 'HelloWorld-Hello guys'
Ожидаемый результат: Hello<wbr>World<wbr>-Hell<wbr>o guys
s = 'HelloWorld-Hello guys'
s.scan(/.{5}|.+/).join("<wbr>")
Пояснение:
Scan группирует все совпадения регулярного выражения в массив. .{5}
соответствует любым 5 символам. Если в конце строки остались символы, они будут сопоставляться с .+
. Присоедините массив к вашей строке
Есть несколько вариантов для этого. Если вы просто хотите вставить строку разделителя, вы можете использовать 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]
Вот решение, которое адаптировано из в недавнем вопросе:
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>')