Верблюд до определенной части струны - PullRequest
0 голосов
/ 07 мая 2018

у меня есть:

s = "like_so__case"

camelize дает это:

s.camelize # => "LikeSoCase"

Я ищу преобразование с двойным подчеркиванием __, чтобы получить:

"LikeSo__case"

Как я могу верблюд только до определенной части строки?

Ответы [ 7 ]

0 голосов
/ 07 мая 2018
def camelize(s)
  for i in 0..s.size-2 do
    if s[i] == "_" and s[i+1] == "_" 
      next
    elsif s[i] == "_" and s[i+1] != "_" and s[i-1] != "_"
      s[i+1] = s[i+1].upcase
      s[i] = ""
    else
      next
    end
  end
  return s
end

Используйте этот метод для решения вашей проблемы

0 голосов
/ 07 мая 2018
s = "like_so__case"

i = s.index('__')
  #=> 7
s.tap { |s| s[0,i] = s[0,i].camelize }
  #=> LikeSo__case

Последняя строка может быть заменена на две строки:

s[0,i] = s[0,i].camelize
s

Если исходная строка не подлежит изменению, напишите

s.dup.tap { |s| s[0,i] = s[0,i].camelize }
0 голосов
/ 07 мая 2018

Нет необходимости полагаться на camelize.Проще говоря, это:

"like_so__case"
.gsub(/_?([a-z])([a-z]*)(?=.*__)/i){$1.upcase + $2.downcase}
# => "LikeSo__case"
0 голосов
/ 07 мая 2018

Ваше описание по запросу не так понятно.

Исходя из вашего исключенного результата, я понимаю его как «верблюд часть строки до шаблона». Прежде всего следует отметить, что camelize не является частью стандартной библиотеки Ruby класса String. ActiveSupport::Inflector обеспечивает это.

Так что если вы хотите просто верблюдить каждую часть, разделенную на шаблон, используйте str.split('_').map(&:capitalize).join('_'). В вашем случае он возвращает 'Like_So__Case'.

Ruby's String имеет еще один метод экземпляра с именем partition, который разбивает строку на три части (массив):

  • Часть до рисунка
  • Узор
  • Часть по шаблону

Так что str.partition('__').tap { |a| a[0] = a[0].split('_').map(&:capitalize).join }.join должен быть вашим ответом простым Ruby.

0 голосов
/ 07 мая 2018

Для получения этого LikeSo__case мы можем сделать так:

s="like_so__case"
s.split('__').tap { |s| s[0] = s[0].camelize }.join('__') 
0 голосов
/ 07 мая 2018
s = "like_so__case"
 => "like_so__case" 
s.split('__', 2).tap { |s| s[0] = s[0].camelize }.join('__')
 => "LikeSo__case" 

Вы, конечно, можете обернуть его в строковый метод

0 голосов
/ 07 мая 2018

Самый простой вариант - gsub часть вашей строки.

'like_so__case'.gsub(/(.*?)(__.*)/) { "#{$1.camelize}#{$2}" }
#=> "LikeSo__case"

UPDATE

Более чистый и быстрый способ, вытекающий из комментариев.

'like_so__case__h'.sub(/(.*?)(?=__)/, &:camelize)
#=> "LikeSo__case__h"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...