Как вставить, отмечают каждые 5 символов на Строке Ruby?

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

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

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

11
задан 030 10 November 2015 в 15:50
поделиться

3 ответа

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

Объяснение:

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

31
ответ дан 3 December 2019 в 01:15
поделиться

Есть несколько вариантов сделать это. Если вы просто хотите вставить строку-разделитель, вы можете использовать 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]  

Приложения

Ссылки

9
ответ дан 3 December 2019 в 01:15
поделиться

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

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"

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


Чтобы подсчитывать только непробельные символы («прикрепление» конечных пробелов к последнему непробельному пространству, оставляя строки, содержащие только пробелы в одиночку):

# 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>')
3
ответ дан 3 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: