对字符串的每一行执行操作

时间:2014-02-04 04:45:59

标签: ruby

我有一个名为“string”的字符串,其中包含六行。 我想从每行的末尾删除一个“Z”(每个都有),并将每行中的第一个字符大写(忽略数字和空格;例如,“1。apple” - >“1。Apple”)

我知道如何做到这一点,但不知道如何在Ruby中做到这一点。我该如何做到这一点?一个循环?语法是什么?

2 个答案:

答案 0 :(得分:2)

使用正则表达式(参见String#gsub):

s = <<EOS
1. applez
2. bananaz
3. catz
4. dogz
5. elephantz
6. fruitz
EOS

puts s.gsub(/z$/i, '').gsub(/^([^a-z]*)([a-z])/i) { $1 + $2.upcase }

# /z$/i - to match a trailing `z` at the end of lines.
# /^([^a-z]*)([a-z])/i - to match leading non-alphabets and alphabet.
#                        capture them as group 1 ($1), group 2 ($2)

输出:

1. Apple
2. Banana
3. Cat
4. Dog
5. Elephant
6. Fruit

答案 1 :(得分:1)

我会通过将问题分解为更小的步骤来解决这个问题。在我们解决了每个较小的问题后,您可以将它们重新组合在一起,以获得更优雅的解决方案。

鉴于falsetru提出的初始字符串:

s = <<EOS
1. applez
2. bananaz
3. catz
4. dogz
5. elephantz
6. fruitz
EOS

1。将您的字符串分解为一个子字符串数组,由换行符分隔。

substrings = s.split(/\n/)

这使用String类&#39; split方法和正则表达式。它搜索所有出现的换行符(反斜杠-n)并将其视为分隔符,根据此分隔符将字符串拆分为子字符串。然后它将所有这些子串抛出到一个数组中,我们将其命名为substrings

2。迭代你的子串数组来做一些事情(稍后详细介绍 stuff

substrings.each do |substring|
.
# Do stuff to each substring
.
end

这是在Ruby中迭代数组的一种形式。您调用Array的{​​{1}}方法,并为其提供一个代码块,该代码块将在阵列中的每个元素上运行。在我们的示例中,我们将在代码块中使用变量名each,以便我们可以为每个substring执行 stuff

3。删除每个子字符串

末尾的 z 字符
substring

现在,当我们遍历数组时,我们要做的第一件事就是删除每个字符串末尾的 z 字符。您可以使用substrings.each do |substring| substring.gsub!(/z$/, '') end gsub!方法执行此操作,这是一种搜索和替换方法。此方法的第一个参数是您正在寻找的正则表达式。在这种情况下,我们正在寻找一个String后跟字符串结尾(用美元符号表示)。第二个参数是一个空字符串,因为我们想要替换没有找到的内容(另一种说法 - 我们只想删除已发现的内容)。

4。找到每个子字符串中第一个字母的索引

z

substrings.each do |substring| substring.gsub!(/z$/, '') index = substring.index(/[a-zA-Z]/) end 类还有一个名为String的方法,它将返回与您提供的正则表达式匹配的字符串第一次出现的索引。在我们的例子中,由于我们想要忽略数字,符号和空格,我们实际上只是在查找子字符串中第一个字母的第一个字母。要做到这一点,我们使用正则表达式index - 这基本上说,&#34;找到我在小A到小Z或从大A到大Z的范围内的任何东西。&#34;现在,我们有一个/[a-zA-Z]/(使用我们的示例字符串,index是3)。

5。将字母大写在我们找到的索引

index

根据我们找到的索引值,我们希望将该索引处的字母替换为相同的字母,但是大写。

6。将我们的substrings.each do |substring| substring.gsub!(/z$/, '') index = substring.index(/[a-zA-Z]/) substring[index] = substring[index].capitalize end 数组重新组合为一个由换行符分隔的单字符串。

现在我们已经完成了每个子字符串所需要做的一切,我们的substrings迭代器块结束了,我们在each数组中得到了我们需要的东西。要将数组作为单个字符串重新组合在一起,我们使用substrings类的join方法。

Array

有了这个,我们现在有一个名为result = substrings.join("\n") 的{​​{1}},它应该是你正在寻找的。

全部放在一起

一旦我们整理了所有步骤,这就是整个解决方案的样子:

String