Как вставить тег каждые 5 символов в строку Ruby? - PullRequest
11 голосов
/ 06 июля 2010

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

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

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

Ответы [ 3 ]

31 голосов
/ 06 июля 2010
s = 'HelloWorld-Hello guys'
s.scan(/.{5}|.+/).join("<wbr>")

Пояснение:

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

9 голосов
/ 06 июля 2010

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

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

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>')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...