这是我的代码:
def weirdcase (string)
string.chars.map.with_index { |letter, index|
unless index.odd?;
letter = letter.upcase
else
letter
end }.compact.join("")
end
这是它应该做的:
"ThIs Is A TeSt"
我得到的结果是:
"ThIs iS A TeSt"
它返回给我错误的字符串,因为它计数/包括我的空格代码。我所需要做的就是找到一种跳过空白的方法,然后我就可以开始了。谢谢!
问题
我假设目标是将每个单词的所有偶数下标的字母(单词的第一个字母的下标为0)大写。
这里有两种方法。这两种方法都使用带正则表达式的String#gsub。根据需要,两种方法可能都需要将str.gsub...
改为str.downcase.gsub...
。
使用正则表达式匹配一个或两个字符的字符串,如果可能的话是两个,并将这些字符串大写。
def weirdcase(str)
str.gsub(/(?<=A| |[^ ]{2})[^ ]{1,2}/) { |s| s.capitalize }
end
weirdcase "this is a sentence for testing"
#=> "ThIs Is A SeNtEnCe FoR TeStInG"
正则表达式为,"匹配除空格以外的一个或两个字符,如果可能的话匹配两个字符([^ ]{1,2}
),紧接在字符串的开头(A
),一个空格或两个除空格以外的字符。(?<=A| |[^ ]{2})
是正面的。
s.capitalize
调用匹配的方法String#capitalize
使用循环枚举数
def weirdcase(str)
enum = [:upcase, :downcase].cycle
str.gsub(/./) do |s|
if s == ' '
enum.rewind
' '
else
s.public_send(enum.next)
end
end
end
weirdcase "this is a sentence for testing"
#=> "ThIs Is A SeNtEnCe FoR TeStInG"
正则表达式/./
匹配字符串中的每个字符。
参见array# cycle, Enumerator#rewind, Enumerator#next和object# public_send。
enum = [:upcase, :downcase].cycle
#=> #<Enumerator: [:upcase, :downcase]:cycle>
enum.next
#=> :upcase
enum.next
#=> :downcase
enum.next
#=> :upcase
enum.rewind
#=> #<Enumerator: [:upcase, :downcase]:cycle>
enum.next
#=> :upcase
enum.next
#=> :downcase
... ad infinitum