遍历仅针对大写字母的数组
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的内容。
我正在尝试遍历我已转换为数组的字符串,并仅针对大写字母,然后我将在大写字母前插入一个空 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的内容。