遍历仅针对大写字母的数组

Looping through array targeting upcase letters only

我正在尝试遍历我已转换为数组的字符串,并仅针对大写字母,然后我将在大写字母前插入一个空 space。我的代码检查第一个大写字母并添加 space 但我正在努力为下一个大写字母做这件事,在本例中是 "T"。任何建议将不胜感激。谢谢

  def break_camel(str)
  # ([A-Z])/.match(str)
  saved_string = str.freeze
  cap_index =str.index(/[A-Z]/)
  puts(cap_index)

   x =str.split('').insert(cap_index, " ")
  x.join

end
break_camel("camelCasingTest")

你必须自己实现吗? 看起来 titleize https://apidock.com/rails/ActiveSupport/Inflector/titleize 涵盖了这个。

我认为您的方法是在需要时不断重新应用您的方法。您的代码的一种扩展是使用递归:

def break_camel(str)
  regex = /[a-z][A-Z]/
  if str.match(regex)
    cap_index = str.index(regex)
    str.insert(cap_index + 1, " ")
    break_camel(str)
  else
    str  
  end
end

break_camel("camelCasingTest") #=> "camel Casing Test"

注意方法里面的break_camel方法。另一种方法是使用 scan 方法在重新加入它们之前传递适当的正则表达式。

在代码中:

'camelCasingTest'.scan(/[A-Z]?[a-z]+/).join(' ') #=> "camel Casing Test"

使用 String#gsub 直接对字符串进行操作比将其分解成多个部分、对每个部分进行操作然后将所有部分重新粘合在一起要容易得多。

def break_camel(str)
  str.gsub(/(?=[A-Z])/, ' ')
end

break_camel("camelCasingTest")
  #=> "camel Casing Test"
break_camel("CamelCasingTest")
  #=> " Camel Casing Test"

这会将 "zero-width position" 紧接在每个大写字母之前(以及前面的字符之后,如果有)转换为 space。表达式 (?=[A-Z]) 称为 正向先行

如果大写字母在行首不想插入space,改方法如下

def break_camel(str)
  str.gsub(/(?<=.)(?=[A-Z])/, ' ')
end

break_camel("CamelCasingTest")
  #=> "Camel Casing Test"

(?<=.) 是一个正向回顾,要求大写字母前面有任何字符才能进行匹配。

另一种写法如下。

def break_camel(str)
  str.gsub(/(?<=.)([A-Z]))/, ' ')
end

break_camel("CamelCasingTest")
  #=> "Camel Casing Test"

这里的正则表达式匹配了一个不在行首的大写字母,并将其保存到捕获组1中。然后将其替换为space后跟捕获组1的内容。