我想从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'
答案 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#lstrip
和String#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"`