如何跳过.map中的空白.鲁比(人名)



这是我的代码:

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

最新更新