Camelize到字符串的某个部分

时间:2018-05-07 08:42:49

标签: ruby-on-rails ruby string

我有:

camelize

s.camelize # => "LikeSoCase" 给出了这个:

__

我正在寻找转换为双下划线"LikeSo__case" 以获得:

rename($image, $all.'.jpg'); // you can change to any extension you like

我怎样才能只追踪字符串的某个部分?

7 个答案:

答案 0 :(得分:8)

最简单的选择是gsub你的字符串的一部分。

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

更新

评论产生的更清洁,更快捷的方式。

'like_so__case__h'.sub(/(.*?)(?=__)/, &:camelize)
#=> "LikeSo__case__h"

答案 1 :(得分:1)

s = "like_so__case"
 => "like_so__case" 
s.split('__', 2).tap { |s| s[0] = s[0].camelize }.join('__')
 => "LikeSo__case" 

你当然可以用字符串方法

包装它

答案 2 :(得分:1)

要获得此 try { URL url = new URL(Vars.searchLink + Vars.searchWord); conn = url.openConnection(); BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream())); String inputLine; while ((inputLine = br.readLine()) != null) if(inputLine.contains("gene-id")) break; ,我们可以这样做:

LikeSo__case

答案 3 :(得分:1)

您对需求的描述不太清楚。

从你的例外结果中,我将其理解为“将一个字符串的一部分用于一个模式”。我应该首先注意一点camelize不是Ruby的类String标准库的一部分。 ActiveSupport::Inflector提供了它。

因此,如果您想将每个部分按照模式分割,请使用str.split('_').map(&:capitalize).join('_')。在您的情况下,它返回'Like_So__Case'

Ruby的String有另一个名为partition的实例方法,它将字符串拆分为三个部分(数组):

  • 模式之前的部分
  • 模式
  • 模式之后的部分

所以str.partition('__').tap { |a| a[0] = a[0].split('_').map(&:capitalize).join }.join应该是你在普通Ruby中的答案。

答案 4 :(得分:1)

无需依赖camelize。简单地说,这个:

"like_so__case"
.gsub(/_?([a-z])([a-z]*)(?=.*__)/i){$1.upcase + $2.downcase}
# => "LikeSo__case"

答案 5 :(得分:0)

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

使用此方法解决您的问题

答案 6 :(得分:0)

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 }