我无法弄清楚如何跳过这些数字(例如1.,2.,3。)。我不应该修改字符串,但仍需要将每行的所有首字母大写(忽略数字)。也许我可以使用each_line
和sub
,也许match
方法。
1. i was just doing this problem.
2. also eating so much food.
3. it was nice listening to the Mahler.
要
1. I was just doing this problem.
2. Also eating so much food.
3. It was nice listening to the Mahler.
答案 0 :(得分:2)
您可以使用gsub
更新多行:
str = <<TEXT
1. i was just doing this problem.
2. also eating so much food.
3. it was nice listening to the Mahler.
TEXT
puts str.gsub(/^(\d+\.[ \t]+)(\w)/) { "#{$1}#{$2.upcase}" }
输出:
1. I was just doing this problem.
2. Also eating so much food.
3. It was nice listening to the Mahler.
^
匹配行的开头(\d+\.[ \t]+)
捕获编号行的开头,即一个或多个数字,后跟一个文字点和空格/制表符(\w)
捕获单个字符第一个捕获组未经修改返回:#{$1}
,而第二个捕获组是upcased:#{$2.upcase}
由于upcase
仅影响字母,您还可以upcase
包括第一个字母在内的所有内容:
puts str.gsub(/^\d+\.[ \t]+\w/, &:upcase)
答案 1 :(得分:1)
可能有更有效的方法来执行此操作,但一种简单的方法是使用pre-match和post-match特殊变量来打印每行的未修改部分,同时仍然调用String#upcase在它的第一封信上。例如:
text = <<'EOF'
1. i was just doing this problem.
2. also eating so much food.
3. it was nice listening to the Mahler.
EOF
text.each_line { |line| line =~ /\p{Alpha}/; print $`, $&.upcase, $' }
这将正确打印:
1. I was just doing this problem.
2. Also eating so much food.
3. It was nice listening to the Mahler.
,同时仍然返回原始的未经修改的字符串:
#=&GT; “1.我只是在做这个问题。\ n2。还吃了那么多食物。\ n3。听马勒很好听。\ n”
答案 2 :(得分:1)
可以预测,修改后的字符串是保留的,所以我建议像:
str=
%{1. i was just doing this problem.
2. also eating so much food.
3.
4. It was nice listening to the Mahler.}
new_str = str.each_line.map { |l| l.sub(/[a-z]/i) { |c| c.upcase } }.join
puts new_str
# 1. I was just doing this problem.
# 2. Also eating so much food.
# 3.
# 4. It was nice listening to the Mahler.
这不会改变str
:
puts str
# 1. i was just doing this problem.
# 2. also eating so much food.
# 3.
# 4. It was nice listening to the Mahler.
或者,您可以添加捕获组并在块中引用其值:
str.each_line.map { |l| l.sub(/([a-z])/i) { $1.upcase } }.join