textarea每行的前导和尾随空格

时间:2014-12-09 17:32:43

标签: ruby-on-rails ruby regex ruby-on-rails-4

  • ruby​​ 2.1.3
  • rails 4.1.7

我想从textarea生成无序列表。因此,我必须保留每个项目的所有换行符,并删除前导和尾随空格。

好吧,我试图从每行textarea 中删除所有前导和尾随空格,但没有成功。

我正在使用正则表达式:

string_from_textarea.gsub(/^[ \t]+|[ \t]+$/, '')

我已经尝试过strip和rstrip rails方法而且没有运气(他们正在使用与正则表达式相同的结果):

  • 每条线的前导空间都被完美删除。
  • 但是使用尾随空格只会删除字符串中的最后一个空格。但是我想要每一行。

我在这里缺少什么?每行的textarea和尾随空格有什么处理?

更新

一些代码示例:

我使用回调来保存格式化数据。

after_validation: format_ingredients

def format_ingredients
    self.ingredients = @ingredients.gsub(/^[ \t]+|[ \t]+$/, "")
end

表单视图:

= f.text_area :ingredients, class: 'fieldW-600 striped', rows: '10'

4 个答案:

答案 0 :(得分:4)

您可以使用String#strip

'   test text with    multiple spaces      '.strip
#=> "test text with    multiple spaces"

将此应用于每一行:

str = "   test \ntext with    multiple  \nspaces      "
str = str.lines.map(&:strip).join("\n")
"test\ntext with    multiple\nspaces"

答案 1 :(得分:1)

我认为@sin可能在他/她的第一条评论中暗示了这个问题。您的文件可能是在Windows机器上生成的,该机器在每行的末尾放置一个回车/生命馈送对("\r\n"),而不是(可能)最后一行,它只写\n。 (在最后一行以外的任何一行检查line[-2]。)这将说明你得到的结果:

r = /^[ \t]+|[ \t]+$/

str = "  testing 123  \r\n testing again  \n"
str.gsub(r, '')
  #=> "testing 123  \r\ntesting again\n"

如果这个理论是正确的,那么修正应该只是对你的正则表达式稍作调整:

r = /^[ \t]+|[ \t\r]+$/

str.gsub(r, '')
  #=> "testing 123\ntesting again\n"

您可以通过更改全局变量$/(即输入记录分隔符,默认为换行符)的值来对正则表达式执行此操作。这可能是最后一行结束时的一个问题,但是,如果它只有一个换行符。

答案 2 :(得分:1)

这对正则表达式来说不是很好用。而是使用标准的字符串处理方法。

如果您的文字包含嵌入的LF(“\ n”)行尾和行的开头和结尾处的空格,请尝试以下操作:

foo = "
 line 1 
  line 2
line 3
"
foo # => "\n line 1 \n  line 2\nline 3\n"

以下是如何清理前导/尾随空白行并重新添加行尾:

bar = foo.each_line.map(&:strip).join("\n")
bar # => "\nline 1\nline 2\nline 3"

如果您正在处理CRLF线端,因为Windows系统会生成文本:

foo = "\r\n line 1 \r\n  line 2\r\nline 3\r\n"
bar = foo.each_line.map(&:strip).join("\r\n")
bar # => "\r\nline 1\r\nline 2\r\nline 3"

如果您正在处理包含其他形式的白色空间(如非破坏空格)的空白区域的可能性,那么切换到使用POSIX [[:space:]]字符集的正则表达式,其中包含白色-space用于所有字符集。我会做类似的事情:

s.sub(/^[[:space:]]+/, '').sub(/[[:space:]]+$/, '')

答案 3 :(得分:-1)

我认为您可能正在寻找String#lstripString#rstrip方法:

str = %Q^this is a line  
and so is this  
all of the lines have two spaces at the beginning  
and also at the end  ^`

`> new_string = ""
> "" 
str.each_line do |line|
     new_string += line.rstrip.lstrip + "\n"
   end
 > "this is a line\n  and so is this  \n  all of the lines have two spaces at the beginning  \n  and also at the end  " 
2.1.2 :034 > puts new_string
this is a line
and so is this
all of the lines have two spaces at the beginning
and also at the end
> new_string
`> "this is a line\nand so is this\nall of the lines have two spaces at the beginning\nand also at the end\n"`