Ruby:移除字符串开头的空白字符

21

编辑:我使用strip!去除了开头和结尾的空格,如我在这个视频中所示。然后,我通过迭代并添加空格来恢复数组中每个字符串结尾的空格。与“重复项”不同,我的意图是保留末尾的空格。但是,如果你的意图是去除前导和尾随空格,strip!会同时去除两者。 (我本想将此作为答案发布,但由于这个问题被错误地标记为重复项,因此我只能编辑我的原始问题以包括此内容。)

我有一个单词数组,我想要移除可能存在于单词开头而不是结尾的任何空格。 rstrip!仅处理字符串的末尾。我希望从字符串开头移除空格。

example_array = ['peanut', ' butter', 'sammiches']
desired_output = ['peanut', 'butter', 'sammiches']

正如你所看到的,数组中并非所有元素都有空格问题,因此我不能像处理所有以单个空格字符开头的元素那样只删除第一个字符。

完整代码:

words = params[:word].gsub("\n", ",").delete("\r").split(",")
words.delete_if {|x| x == ""}
words.each do |e|
  e.lstrip!
end

用户可能在表单上输入的示例文本:

Corn on the cob,
Fibonacci,
StackOverflow
Chat, Meta, About
Badges
Tags,,
Unanswered
Ask Question

1
我的第一个问题是,你是如何创建这些数组的?是通过使用子字符串提取来拆分其他字符串吗?如果是这样,你可能需要展示一下代码,我们可以帮助修复根本原因。 - the Tin Man
刚刚添加了完整的代码。 :) - Melanie Shebel
1
你能提供一些示例文本吗? - Andrew Grimm
2
没问题,Melanie。这就是我们在这里做的事情。分析别人的代码并让它发挥作用! - the Tin Man
3个回答

37

String#lstrip(或String#lstrip!)是您需要的东西

desired_output = example_array.map(&:lstrip)

关于你的代码有更多的评论:

  1. delete_if {|x| x == ""} 可以被替换为 delete_if(&:empty?)
  2. 除非你想要用 reject!,因为 delete_if 只会返回一个不同的数组,而不是修改现有的数组。
  3. words.each {|e| e.lstrip!} 可以被替换为 words.each(&:lstrip!)
  4. delete("\r") 如果你在 Windows 机器上读取 Windows 格式的文本文件,或者在 Unix 机器上读取 Unix 格式的文本文件,则应该是冗余的。
  5. split(",") 可以被替换为 split(", ")split(/, */) (或者如果最多只应该有一个空格,则为 /, ?/

现在看起来像这样:

words = params[:word].gsub("\n", ",").split(/, ?/)
words.reject!(&:empty?)
words.each(&:lstrip!)

如果你能提供示例文本,我就可以给出更多建议。

编辑:好的,来吧:

temp_array = text.split("\n").map do |line|
  fields = line.split(/, */)
  non_empty_fields = fields.reject(&:empty?)
end
temp_array.flatten(1)

使用的方法是String#splitEnumerable#mapEnumerable#rejectArray#flatten

Ruby还有用于解析逗号分隔文件的库,但我认为它们在1.8和1.9之间略有不同。


1
当然是啊!我感觉自己像个白痴。我一遍又一遍地扫描了rdocs,但就是没看到它。 - Melanie Shebel
2
只需要补充一下...String.strip将同时处理前导和尾随的空格。 - Vic
1
如果你想原地修改数组,只需使用 a.each(&:lstrip!) - mu is too short

12
> ' string '.lstrip.chop
=> "string"

去除字符串两端的空格...


6
' string '.lstrip.rstrip 如何?像 .chop 一样,可以将一个字符从末尾移除。 - David Douglas
13
针对 David 的评论:我们可以只使用 .strip 方法来得到与 .lstrip.rstrip 相同的结果。http://ruby-doc.org/core-2.2.2/String.html#method-i-strip - Furkan Ayhan
请考虑编辑您的答案,添加更新以更正您原来的答案。 - Dawn Green
chop会删除末尾的任何字符,而不仅仅是空格。 - David Cook

0
< p >在问题和一些评论中提到了< code >strip方法,但也值得在一个单独的答案中提及。该方法是一个删除前导和尾部空格的字符串的副本。我认为这是最优雅的方法。< /p >
' Hello there '.strip   #=> "Hello there"

有关信息,请参见https://apidock.com/ruby/String/strip


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接