我正在尝试获取输入文本文件,并以特定方式在其中插入html标签。该文件的第一部分需要采用与第二部分不同的格式,所以我想做的是:
基本上我已经能够完成1-3和6的步骤,但是当我在第4步中添加时,我遇到了问题
到目前为止,这是我的代码:
file_names = ['ex_poem.txt']
file_names.each do |file_name|
text = File.read(file_name)
#clean the text
# remove extra returns
clean_text = text.gsub(/\n(\n)+/, "\n\n")
# remove spaces from ends of lines
clean_text = clean_text.gsub(/ +\n/, "\n")
# remove spaces blank lines
clean_text = clean_text.gsub(/(?<=\n) +/, "")
# remove returns at start of doc
clean_text = clean_text.gsub(/\A\n*/, "")
# remove returns at end of doc
clean_text = clean_text.gsub(/\n*\Z/, "")
# parse out poem section
poem = clean_text.scan(/[\s\S]*(?=\n\n@@@)/)
poem = poem.gsub(/\A|(?<=\n)+(?!\n)+(?!\Z)/,"<p class=\"poetry-line\">")
# poem = poem.gsub(/\n\n/, "\n\n\n\n\n")
# parse out notes section
notes = clean_text.scan(/(?<=@@@\n\n)[\s\S]*/)
puts clean_text
puts poem
puts notes
end
这将引发以下错误:
poemify.2.rb:22:in `block in <main>': undefined method `gsub' for #<Array:0x00007f94b104c2c8> (NoMethodError)
from poemify.2.rb:3:in `each'
from poemify.2.rb:3:in `<main>'
但是如果我评论这一行
poem = poem.gsub(/\A|(?<=\n)+(?!\n)+(?!\Z)/,"<p class=\"poetry-line\">")
然后脚本运行正常。这使我感到困惑,因为我在脚本中较早的时候将.gsub
变量与clean_text
一起使用了poem
,并且可以正常工作,但是当我将puts poem
变量与.scan
一起使用时,它不起作用。但是当将违规行注释掉后,poem
实际上可以正常工作。
我怀疑我对初始化变量或某些东西的方式不了解非常基本的东西,但是我被卡住了。
更新:
在展示了.gsub
如何将poem
变成数组之后,我对正则表达式进行了重新设计,以便可以使用notes
,因此.gsub
和poem = clean_text.gsub(/\n(?=@@@\n\n)[\s\S]*/, "")
将会是一个字符串,并且我可以按照自己了解的方式继续使用notes = clean_text.gsub(/[\s\S]*(?<=\n\n@@@\n\n)/, "")
:
moment
Vue.use()
答案 0 :(得分:1)
iterator
保存poem
的结果,该结果返回scan
,而不是Array
。
您可以在此处查看文档:{{3}}
String
不能在gsub
上调用。您可以在Array
上map
,然后在每个元素上调用Array
。
如果扫描结果包含组,则需要gsub
覆盖初始map
的每个元素,它将包含map
s个Array
。
此外,如果没有匹配项,您仍然会收到空白的Array
。